Analysis plan

Goal: Characterize Parkinson’s associated DNA methylation as a combination of genetic and environmental factors. This includes: 1. Heritability of DMR tagCpGs in relation to all CpG sites 2. A model ranking scheme for SNP association in cis and E events 3. Relationship, if any, between patterns observed in ranking with number of SNPs in cis to CpG site

Model Ranking

I’ve set up my code to take in CpG sites and matrixEQTL formatted genetic and expression data. Here I will load in DMRs prior to setting rank_cis_cpg_models running:

heritability <- fread("terre_heritability_150kb_mvalue.txt")
|--------------------------------------------------|
|==================================================|
(f_dmrs <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/TERRE/sig.cpgs.TERRE.F.HT.ancestry.csv"))
(m_dmrs <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/TERRE/sig.cpgs.TERRE.M.HT.ancestry.csv"))

sum(f_dmrs$cpg %in% m_dmrs$cpg) # overlap between M and F
[1] 5
# num heritable in cis
sum(m_dmrs$cpg %in% heritability[P < 0.05]$probe)
[1] 72
sum(f_dmrs$cpg %in% heritability[P < 0.05]$probe)
[1] 135
# proportion heritable in cis
sum(m_dmrs$cpg %in% heritability[P < 0.05]$probe) / nrow(m_dmrs)
[1] 0.1506276
sum(f_dmrs$cpg %in% heritability[P < 0.05]$probe) / nrow(f_dmrs)
[1] 0.140625
# total proportion heritable in cis
nrow(heritability[P < 0.05]) / nrow(heritability)
[1] 0.06881319

Checking if these proportions are larger than expected at random:

# Test 1 is proportion significantly different than proportion of heritable CpGs
prop.test(c(72, 53165), c(407, 772599))

    2-sample test for equality of proportions with continuity correction

data:  c(72, 53165) out of c(407, 772599)
X-squared = 72.439, df = 1, p-value < 2.2e-16
alternative hypothesis: two.sided
95 percent confidence interval:
 0.06978562 0.14639636
sample estimates:
    prop 1     prop 2
0.17690418 0.06881319 
prop.test(c(135, 53165), c(960, 772599))

    2-sample test for equality of proportions with continuity correction

data:  c(135, 53165) out of c(960, 772599)
X-squared = 75.956, df = 1, p-value < 2.2e-16
alternative hypothesis: two.sided
95 percent confidence interval:
 0.04929259 0.09433104
sample estimates:
    prop 1     prop 2
0.14062500 0.06881319 
prop.test(c(72, 135), c(407, 960))

    2-sample test for equality of proportions with continuity correction

data:  c(72, 135) out of c(407, 960)
X-squared = 2.6521, df = 1, p-value = 0.1034
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.008573634  0.081131988
sample estimates:
   prop 1    prop 2
0.1769042 0.1406250 
library(stats)
# Test 2 is proportion different than if CpGs were selected at random
1 - phyper(72, sum(heritability$P < 0.05), sum(heritability$P > 0.05), 407)
[1] 6.905587e-14
1 - phyper(135, sum(heritability$P < 0.05), sum(heritability$P > 0.05), 960)
[1] 1.998401e-15
# Permutation test
sum(sapply(1:10000, function(i) sum(sample(heritability$P < 0.05, 407))) >= 72) / 10000
[1] 0
sum(sapply(1:10000, function(i) sum(sample(heritability$P < 0.05, 960))) >= 135) / 10000
[1] 0

Let’s plot out the h2 value for these “heritable” DMRs, as well as the number of cis SNPs for these DMR CpGs:

heritability_sig <- fread("terre_heritability_150kb_mvalue_sig.txt")
ggplot(heritability[m_dmrs$cpg, on = .(probe)][P < 0.05], aes(h2)) +
  geom_histogram(bins = 30) +
  coord_cartesian(xlim = c(0.2, 1.0), ylim = c(0, 20))
ggplot(heritability[f_dmrs$cpg, on = .(probe)][P < 0.05], aes(h2)) +
  geom_histogram(bins = 30) +
  coord_cartesian(xlim = c(0.2, 1.0), ylim = c(0, 20))

ggplot(heritability_sig[m_dmrs$cpg, on = .(probe)][P < 0.05], aes(n_cis_snps)) +
  geom_histogram(bins = 30) +
  coord_cartesian(xlim = c(0, NA))
ggplot(heritability_sig[f_dmrs$cpg, on = .(probe)][P < 0.05], aes(n_cis_snps)) +
  geom_histogram(bins = 30) +
  coord_cartesian(xlim = c(0, NA))
f_heritable <- f_dmrs[cpg %chin% heritability[P < 0.05]$probe][order(-minpvalue)]
m_heritable <- m_dmrs[cpg %chin% heritability[P < 0.05]$probe][order(-minpvalue)]
m_heritable$h2 <- heritability[m_heritable$cpg, on = "probe"]$h2
f_heritable$h2 <- heritability[f_heritable$cpg, on = "probe"]$h2

f_heritable[order(-h2, minpvalue)]
m_heritable[order(-h2, minpvalue)]

Analysis of cis-mQTLs at each DMR

cis_mQTLs <- fread("../prs_ewas_integration/cis_mQTL_analyses/terre_data/cis_all_impute_mQTL_results_CTP.txt.gz")
mQTLs_at_mdmr <- cis_mQTLs[m_dmrs$cpg, on = "gene"]
mQTLs_at_fdmr <- cis_mQTLs[f_dmrs$cpg, on = "gene"]
cis_mQTLs[FDR < 0.05]
cis_mQTLs[FDR < 0.05 & !duplicated(gene)]

Digging into these:

merge(f_dmrs, mQTLs_at_fdmr[, .(min(`p-value`)), by = "gene"], by.x = "cpg", by.y = "gene")
merge(m_dmrs, mQTLs_at_mdmr[, .(min(`p-value`)), by = "gene"], by.x = "cpg", by.y = "gene")

Sex-stratified mQTL analysis

cis_mQTLs_m <- fread("../prs_ewas_integration/cis_mQTL_analyses/terre_data/male_cis_all_impute_mQTL_results_CTP.txt.gz", key = c("SNP", "gene"))
male_mQTLs_at_mdmr <- cis_mQTLs_m[m_dmrs$cpg, on = "gene"]
cis_mQTLs_f <- fread("../prs_ewas_integration/cis_mQTL_analyses/terre_data/female_cis_all_impute_mQTL_results_CTP.txt.gz", key = c("SNP", "gene"))
female_mQTLs_at_fdmr <- cis_mQTLs_f[f_dmrs$cpg, on = "gene"]
hist(cis_mQTLs_f$`p-value`, breaks = 100, main = "Distribution of cis mQTL P Values in Females", ylim = c(0, 10e6))
abline(h = nrow(cis_mQTLs_f) / 100)

hist(cis_mQTLs_m$`p-value`, breaks = 100, main = "Distribution of cis mQTL P Values in Males", ylim = c(0, 10e6))
abline(h = nrow(cis_mQTLs_m) / 100)
male_mQTLs_at_mdmr[, "P" := min(`p-value`), by = "gene"]
female_mQTLs_at_fdmr[, "P" := min(`p-value`), by = "gene"]
male_mQTLs_at_mdmr
female_mQTLs_at_fdmr
hist(male_mQTLs_at_mdmr[!duplicated(gene)]$P)
hist(female_mQTLs_at_fdmr[!duplicated(gene)]$P)

hist(male_mQTLs_at_mdmr$`p-value`, breaks = 100, main = "Distribution of cis-mQTL P Values at Male DMRs", ylim = c(0, 50000))
abline(h = nrow(male_mQTLs_at_mdmr) / 100)

hist(female_mQTLs_at_fdmr$`p-value`, breaks = 100, main = "Distribution of cis-mQTL P Values at Female DMRs")
abline(h = nrow(female_mQTLs_at_fdmr) / 100)


# heritability[P < 0.05][m_dmrs$cpg[m_dmrs$cpg %in% f_dmrs$cpg],on="probe"]
library(qqman)
library(qvalue)
qq(male_mQTLs_at_mdmr$`p-value`)
qq(female_mQTLs_at_fdmr$`p-value`)
m_matched_stat <- cis_mQTLs_m[cis_mQTLs_f[FDR < 0.05][, .(SNP, gene)], on = c("SNP", "gene")]
f_matched_stat <- cis_mQTLs_f[cis_mQTLs_m[FDR < 0.05][, .(SNP, gene)], on = c("SNP", "gene")]

AIC values for sex-stratified G models

(male_g_aic <- fread("male_dnam_breakdown.txt")[order(aic)])
(female_g_aic <- fread("female_dnam_breakdown.txt")[order(aic)])
m_min_aic <- male_g_aic[, .(aic = min(aic), sex = "male"), by = "cpg"]
f_min_aic <- female_g_aic[, .(aic = min(aic), sex = "female"), by = "cpg"]
ggplot(rbind(m_min_aic, f_min_aic), aes(aic, fill = sex)) +
  geom_histogram(bins = 100, alpha = .9) +
  ggtitle("Minimum G-model AIC Value per DMR per Sex") +
  theme_minimal()

AIC values for top 5 represented E + Pesticides of Interest

male_all_aic <- unique(rbindlist(lapply(fs::dir_ls(glob = "male*breakdown.txt.gz"), fread), fill = TRUE))
female_all_aic <- unique(rbindlist(lapply(fs::dir_ls(glob = "female*breakdown.txt.gz"), fread), fill = TRUE))

Ranking models

female_dmr_cpgs <- fread("~/AIC_F.csv")
male_dmr_cpgs <- fread("~/AIC_M.csv")
male_min_aic_models <- male_all_aic[, .SD[which.min(aic)], by = c("cpg", "model")][, .SD[which.min(aic)], by = "cpg"]
female_min_aic_models <- female_all_aic[, .SD[which.min(aic)], by = c("cpg", "model")][, .SD[which.min(aic)], by = "cpg"]
female_min_aic_models[order(-model)]
female_min_aic_models[order(-model)]
unique(female_min_aic_models$env)
write.csv(female_min_aic_models %>% filter(grepl("E", model)) %>% select(cpg, SNP, model, env, aic), quote = F)

write.csv(female_min_aic_models %>% filter(grepl("E", model)) %>% select(cpg, SNP, model, env, aic) %>% filter(cpg %in% female_dmr_cpgs$CpG), quote = F)
write.csv(male_min_aic_models %>% filter(grepl("E", model)) %>% select(cpg, SNP, model, env, aic) %>% filter(cpg %in% male_dmr_cpgs$CpG), quote = F)
write.csv(female_min_aic_models %>% select(cpg, SNP, model, env, aic) %>% filter(cpg %in% female_dmr_cpgs$CpG), quote = F)
write.csv(male_min_aic_models %>% select(cpg, SNP, model, env, aic) %>% filter(cpg %in% male_dmr_cpgs$CpG), quote = F)
ggplot(male_min_aic_models %>% filter(cpg %in% male_dmr_cpgs$CpG), aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = -0.5)
ggplot(female_min_aic_models %>% filter(cpg %in% female_dmr_cpgs$CpG), aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = -0.5) +
  ggtitle("Female DMR models (representative CpGs)")

Ranges of AIC values across models

both_sex_aic <- bind_rows(list(male = male_all_aic %>% filter(cpg %in% male_dmr_cpgs$CpG), female = female_all_aic %>% filter(cpg %in% female_dmr_cpgs$CpG)), .id = "Sex")
ggplot(both_sex_aic, aes(aic, fill = Sex)) +
  geom_histogram() +
  facet_grid(rows = vars(model), scales = "free_y")
male_all_aic[model == "E"]

Models accounting for PD

  • Step 1: read in data, run multiple test correction
  • step 2: remove those which don’t pass a significance threshold
  • step 3: rank by AIC Loading in all experiments
males_pd <- rbindlist(lapply(Sys.glob("male_terre_pd_f_*_dnam_breakdown.txt.gz"), function(f) fread(f, fill = TRUE)), fill = TRUE)
males_pd[, c("f_q") := c(p.adjust(f_p, method = "BH")), by = c("model", "env")]
females_pd <- rbindlist(lapply(Sys.glob("female_terre_pd_f_*_dnam_breakdown.txt.gz"), function(f) fread(f, fill = TRUE)), fill = TRUE)
females_pd[, c("f_q") := c(p.adjust(f_p, method = "BH")), by = c("model", "env")]

Exclude models based on F test and delta beta cutoff vs baseline

(min_f_females_pd <- females_pd[order(cpg), .SD[which.min(aic)], by = c("cpg", "model")][f_q < 0.05])
(min_f_males_pd <- males_pd[order(cpg), .SD[which.min(aic)], by = c("cpg", "model")][f_q < 0.05])
ggplot(min_f_females_pd[, .SD[which.min(f_p)], by = "cpg"], aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = 0) +
  ggtitle("Female Models ranked by P(F) accounting for\nPD status") +
  coord_cartesian(ylim = c(0, 1000))
ggplot(min_f_males_pd[, .SD[which.min(f_p)], by = "cpg"], aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = 0) +
  ggtitle("Male Models ranked by P(F) accounting for\nPD status") +
  coord_cartesian(ylim = c(0, 1000))
ggplot(min_f_females_pd, aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = 0) +
  ggtitle("Significant Female Models accounting for\nPD status") +
  coord_cartesian(ylim = c(0, 1000))
ggplot(min_f_males_pd, aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = 0) +
  ggtitle("Significant Male Models accounting for\nPD status") +
  coord_cartesian(ylim = c(0, 1000))
(min_aic_females_pd <- females_pd[order(cpg), .SD[which.min(aic)], by = "cpg"])
(min_aic_males_pd <- males_pd[order(cpg), .SD[which.min(aic)], by = "cpg"])
p1 <- ggplot(min_aic_females_pd %>% mutate(sig_f = factor(f_q < 0.05, levels = c(TRUE, FALSE))), aes(model, fill = sig_f)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0) +
  coord_cartesian(ylim = c(0, 1000)) +
  labs(fill = "FDR < 0.05") +
  theme_classic() +
  scale_fill_manual(values = c("lightpink2", "lightpink4"))

p2 <- ggplot(min_aic_males_pd %>% mutate(sig_f = factor(f_q < 0.05, levels = c(TRUE, FALSE))), aes(model, fill = sig_f)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0) +
  coord_cartesian(ylim = c(0, 1000)) +
  labs(fill = "FDR < 0.05") +
  theme_classic() +
  scale_fill_manual(values = c("lightsteelblue2", "lightsteelblue4"))




p3 <- ggplot(min_aic_females_pd %>% mutate(sig_f = factor(f_q < 0.05, levels = c(TRUE, FALSE))) %>% filter(cpg %in% female_dmr_cpgs$CpG), aes(model, fill = sig_f)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0) +
  coord_cartesian(ylim = c(0, 50)) +
  labs(fill = "FDR < 0.05") +
  theme_classic() +
  scale_fill_manual(values = c("lightpink2", "lightpink4"))

p4 <- ggplot(min_aic_males_pd %>% mutate(sig_f = factor(f_q < 0.05, levels = c(TRUE, FALSE))) %>% filter(cpg %in% male_dmr_cpgs$CpG), aes(model, fill = sig_f)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0) +
  labs(fill = "FDR < 0.05") +
  theme_classic() +
  coord_cartesian(ylim = c(0, 50)) +
  scale_fill_manual(values = c("lightsteelblue2", "lightsteelblue4"))
cowplot::plot_grid(p1, p2, p3, p4, nrow = 2, labels = "AUTO")
min_aic_females_pd %>%
  filter(f_q < 0.05, cpg %in% female_dmr_cpgs$CpG, model == "GxE") %>%
  write.csv()
Error: Problem with `filter()` input `..2`.
ℹ Input `..2` is `cpg %in% female_dmr_cpgs$CpG`.
x object 'female_dmr_cpgs' not found
Run `rlang::last_error()` to see where the error occurred.

Nested models

female_nested <- fread("female_terre_pd_fnested_dnam_breakdown.txt.gz")
female_nested[, `:=`(
  f_q_gxe = p.adjust(f_p_gxe, method = "BH"),
  f_q_gee = p.adjust(f_p_gee, method = "BH"),
  f_q_geg = p.adjust(f_p_geg, method = "BH"),
  f_q_g = p.adjust(f_p_g, method = "BH"),
  f_q_e = p.adjust(f_p_e, method = "BH")
),
by = "env"
]
male_nested <- fread("male_terre_pd_fnested_dnam_breakdown.txt.gz")
male_nested[, `:=`(
  f_q_gxe = p.adjust(f_p_gxe, method = "BH"),
  f_q_gee = p.adjust(f_p_gee, method = "BH"),
  f_q_geg = p.adjust(f_p_geg, method = "BH"),
  f_q_g = p.adjust(f_p_g, method = "BH"),
  f_q_e = p.adjust(f_p_e, method = "BH")
),
by = "env"
]
(f_gxe_count <- female_nested[f_q_gxe < 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])
(m_gxe_count <- male_nested[f_q_gxe < 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])

(f_ge_count <- female_nested[f_q_gxe > 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])
(m_ge_count <- male_nested[f_q_gxe > 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])

(f_g_count <- female_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g < 0.05 & f_q_e > 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])
(m_g_count <- male_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g < 0.05 & f_q_e > 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])

(f_e_count <- female_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g > 0.05 & f_q_e < 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])
(m_e_count <- male_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g > 0.05 & f_q_e < 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"])

Restricting to just those DMRs which pass a stricter cutoff:

(sig_f_gxe_count <- female_nested[f_q_gxe < 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% female_dmr_cpgs$V1])
(sig_m_gxe_count <- male_nested[f_q_gxe < 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% male_dmr_cpgs$V1])

(sig_f_ge_count <- female_nested[f_q_gxe > 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% female_dmr_cpgs$V1])
(sig_m_ge_count <- male_nested[f_q_gxe > 0.05 & (f_q_gee < 0.05 | f_q_geg < 0.05) & (f_q_g < 0.05 | f_q_e < 0.05)][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% male_dmr_cpgs$V1])

(sig_f_g_count <- female_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g < 0.05 & f_q_e > 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% female_dmr_cpgs$V1])
(sig_m_g_count <- male_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g < 0.05 & f_q_e > 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% male_dmr_cpgs$V1])

(sig_f_e_count <- female_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g > 0.05 & f_q_e < 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% female_dmr_cpgs$V1])
(sig_m_e_count <- male_nested[f_q_gxe > 0.05 & f_q_gee > 0.05 & f_q_geg > 0.05 & f_q_g > 0.05 & f_q_e < 0.05][, .(snps = length(unique(snp)), envs = paste0(unique(env), collapse = ",")), by = "cpg"][cpg %in% male_dmr_cpgs$V1])
Plotting counts from previous Section
f_nested_count <- data.table(
  count = c(nrow(f_gxe_count), nrow(f_ge_count), nrow(f_g_count), nrow(f_e_count)),
  Model = c("GxE", "G+E", "G", "E")
)

m_nested_count <- data.table(
  count = c(nrow(m_gxe_count), nrow(m_ge_count), nrow(m_g_count), nrow(m_e_count)),
  Model = c("GxE", "G+E", "G", "E")
)
sig_f_nested_count <- data.table(
  count = c(nrow(sig_f_gxe_count), nrow(sig_f_ge_count), nrow(sig_f_g_count), nrow(sig_f_e_count)),
  Model = c("GxE", "G+E", "G", "E")
)

sig_m_nested_count <- data.table(
  count = c(nrow(sig_m_gxe_count), nrow(sig_m_ge_count), nrow(sig_m_g_count), nrow(sig_m_e_count)),
  Model = c("GxE", "G+E", "G", "E")
)


ggplot(f_nested_count, aes(Model, count, label = count)) +
  geom_col() +
  geom_text(position = position_dodge(width = 1), vjust = 0)
ggplot(m_nested_count, aes(Model, count, label = count)) +
  geom_col() +
  geom_text(position = position_dodge(width = 1), vjust = 0)
ggplot(sig_f_nested_count, aes(Model, count, label = count)) +
  geom_col() +
  geom_text(position = position_dodge(width = 1), vjust = 0)
ggplot(sig_m_nested_count, aes(Model, count, label = count)) +
  geom_col() +
  geom_text(position = position_dodge(width = 1), vjust = 0)
AIC models that match with nested definition
m_gxe_count$model <- "GxE"
m_ge_count$model <- "G+E"
m_g_count$model <- "G"
m_e_count$model <- "E"

f_gxe_count$model <- "GxE"
f_ge_count$model <- "G+E"
f_g_count$model <- "G"
f_e_count$model <- "E"

m_aic_fnested <- merge(min_aic_males_pd, rbind(m_gxe_count, m_ge_count, m_g_count, m_e_count), by = c("cpg", "model"))
f_aic_fnested <- merge(min_aic_females_pd, rbind(f_gxe_count, f_ge_count, f_g_count, f_e_count), by = c("cpg", "model"))


ggplot(f_aic_fnested, aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0)
ggplot(m_aic_fnested, aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0)

ggplot(f_aic_fnested[cpg %in% female_dmr_cpgs$V1], aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0)
ggplot(m_aic_fnested[cpg %in% male_dmr_cpgs$V1], aes(model)) +
  geom_bar() +
  geom_text(aes(label = ..count..), position = position_dodge(width = 1), stat = "count", vjust = 0)
Gene analysis
annotation <- fread("~/MethylationEPIC_v-1-0_B4.csv", skip = 7, fill = TRUE)

f_nested_annot <- merge(annotation, rbind(f_gxe_count, f_ge_count, f_g_count, f_e_count), by.x = "Name", by.y = "cpg")
m_nested_annot <- merge(annotation, rbind(m_gxe_count, m_ge_count, m_g_count, m_e_count), by.x = "Name", by.y = "cpg")

unique(f_nested_annot, by = "UCSC_RefGene_Name")[model == "GxE"]
unique(m_nested_annot, by = "UCSC_RefGene_Name")[model == "GxE"]

unique(f_nested_annot, by = "UCSC_RefGene_Name")[model == "E"]
unique(m_nested_annot, by = "UCSC_RefGene_Name")[model == "E"]

unique(f_nested_annot, by = "UCSC_RefGene_Name")[Name %in% female_dmr_cpgs$V1 & model == "G+E"]
unique(m_nested_annot, by = "UCSC_RefGene_Name")[Name %in% male_dmr_cpgs$V1 & model == "G+E"]

unique(f_nested_annot, by = "UCSC_RefGene_Name")[Name %in% female_dmr_cpgs$V1 & model == "G"]
unique(m_nested_annot, by = "UCSC_RefGene_Name")[Name %in% male_dmr_cpgs$V1 & model == "G"]

missMethyl::gometh(f_nested_annot[Name %in% female_dmr_cpgs$V1]$Name, array.type = "EPIC") %>% arrange(P.DE)
missMethyl::gometh(f_nested_annot[Name %in% female_dmr_cpgs$V1]$Name, array.type = "EPIC", collection = "KEGG") %>% arrange(P.DE)
CpG sites for which neither G or E outperformed
female_dmr_cpgs[!female_dmr_cpgs$V1 %in% f_nested_annot$Name]
male_dmr_cpgs[!male_dmr_cpgs$V1 %in% m_nested_annot$Name]

Viewing G and E effects and comparing to interaction model

male_gpe_model <- fread("male_terre_pd_f_G+E_dnam_breakdown.txt.gz")
female_gpe_model <- fread("female_terre_pd_f_G+E_dnam_breakdown.txt.gz")
male_gpe_model[, `:=`(Gq = p.adjust(Gp, method = "BH"), Eq = p.adjust(Ep, method = "BH")), by = "env"]
female_gpe_model[, `:=`(Gq = p.adjust(Gp, method = "BH"), Eq = p.adjust(Ep, method = "BH")), by = "env"]
length(unique(male_gpe_model[Gq < 0.05]$cpg))
[1] 335
length(unique(male_gpe_model[Eq < 0.05]$cpg))
[1] 5
male_gpe_model[Gq > 0.05 & Eq < 0.05]
male_gpe_model[Gq < 0.05 & Eq > 0.05]
male_gpe_model[Gq < 0.05 & Eq < 0.05]

length(unique(female_gpe_model[Gq < 0.05]$cpg))
[1] 631
length(unique(female_gpe_model[Eq < 0.05]$cpg))
[1] 0
length(unique(female_gpe_model$cpg))
[1] 930
female_gpe_model[Gq > 0.05 & Eq < 0.05]
female_gpe_model[Gq < 0.05 & Eq > 0.05]
female_gpe_model[Gq < 0.05 & Eq < 0.05]
ggplot(melt(male_gpe_model[, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

# Check G sig
ggplot(melt(male_gpe_model[Gq < 0.05, .(Gest, Eest)]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(melt(male_gpe_model[Gq < 0.05, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

# Check E sig
ggplot(melt(male_gpe_model[Eq < 0.05, .(Gest, Eest)]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(melt(male_gpe_model[Eq < 0.05, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

# both G and E sig
ggplot(melt(male_gpe_model[Gq < 0.05 & Eq < 0.05, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(male_gpe_model[Gq < 0.05 & Eq < 0.05, ], aes(Gest, Eest, color = cpg)) +
  geom_point()


ggplot(male_gpe_model[Gq < 0.05 & Eq < 0.05, ], aes(-log10(Gp), -log10(Ep), color = cpg)) +
  geom_point() +
  coord_cartesian(xlim = c(2, 5), ylim = c(2, 5))



# E sig G not sig
ggplot(male_gpe_model[Gq > 0.05 & Eq < 0.05, ], aes(Gest, Eest, color = cpg)) +
  geom_point()

ggplot(melt(male_gpe_model[Gq > 0.05 & Eq < 0.05, .(Gest, Eest, cpg, SNP)]), aes(variable, abs(value), color = cpg)) +
  geom_point() +
  geom_line(aes(group = interaction(SNP, cpg))) +
  facet_wrap(~cpg)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns [cpg, SNP]. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(melt(male_gpe_model[Gq > 0.05 & Eq < 0.05, .(Gest, Eest, cpg, SNP)]), aes(variable, abs(value), color = cpg)) +
  geom_point() +
  geom_boxplot() +
  facet_wrap(~cpg)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns [cpg, SNP]. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(male_gpe_model[Gq > 0.05 & Eq < 0.05, ], aes(-log10(Gp), -log10(Ep), color = cpg)) +
  geom_point()

is there interaction at these sites with significant G and E?

male_gpe_interest <- male_gpe_model[Gq < 0.05 & Eq < 0.05, ]
(merge(male_nested, male_gpe_interest, by.x = c("cpg", "snp", "env"), by.y = c("cpg", "SNP", "env")))
Error in merge(male_nested, male_gpe_interest, by.x = c("cpg", "snp",  :
  object 'male_nested' not found
ggplot(melt(female_gpe_model[, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

# Check G sig
ggplot(melt(female_gpe_model[Gq < 0.05, .(Gest, Eest)]) %>% mutate(variable = recode(variable, "V1" = "G_effect", "V2" = "E_effect")), aes(value, fill = variable)) +
  geom_density(alpha = 0.5) +
  ggtitle("Distribution of effect sizes for significant G models")
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(melt(female_gpe_model[Gq < 0.05, .(-log10(Gp), -log10(Ep))]) %>% mutate(variable = recode(variable, "V1" = "-log10(Gp)", "V2" = "-log10(Ep)")), aes(value, fill = variable)) +
  geom_density(alpha = 0.5) +
  ggtitle("Distribution of P values for significant G models")
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

# Check E sig
ggplot(melt(female_gpe_model[Eq < 0.05, .(Gest, Eest)]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(melt(female_gpe_model[Eq < 0.05, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

# both G and E sig
ggplot(melt(female_gpe_model[Gq < 0.05 & Eq < 0.05, .(-log10(Gp), -log10(Ep))]), aes(value, fill = variable)) +
  geom_density(alpha = 0.5)
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns []. Consider providing at least one of 'id' or 'measure' vars in future.

ggplot(female_gpe_model[Gq < 0.05 & Eq < 0.05, ], aes(Gest, Eest, color = cpg)) +
  geom_point()


ggplot(female_gpe_model[Gq < 0.05 & Eq < 0.05, ], aes(-log10(Gp), -log10(Ep), color = cpg)) +
  geom_point() +
  coord_cartesian(xlim = c(2, 5), ylim = c(2, 5))



# E sig G not sig
ggplot(female_gpe_model[Gq > 0.05 & Eq < 0.05, ], aes(Gest, Eest, color = cpg)) +
  geom_point()


ggplot(female_gpe_model[Gq > 0.05 & Eq < 0.05, ], aes(-log10(Gp), -log10(Ep), color = cpg)) +
  geom_point()

Comparing \(R^2\) for each model

male_gxe_model <- fread("male_terre_pd_f_GxE_dnam_breakdown.txt.gz")
female_gxe_model <- fread("female_terre_pd_f_GxE_dnam_breakdown.txt.gz")
gxe_vs_gpe <- data.frame(gxe_r2 = male_gxe_model$R2, gpe_r2 = male_gpe_model$R2)
ggplot(gxe_vs_gpe, aes(gxe_r2, gpe_r2)) +
  geom_bin2d()

gxe_vs_gpe <- data.frame(gxe_r2 = female_gxe_model$R2, gpe_r2 = female_gpe_model$R2)
ggplot(gxe_vs_gpe, aes(gxe_r2, gpe_r2)) +
  geom_bin2d()

Additional last questions

what proportion of CpGs have neither G nor E effect

write.csv(male_gpe_model[!cpg %in% effect_cpgs_male & cpg %in% male_dmr_cpgs$V1,.SD[which.min(aic)],by=cpg])
"","cpg","SNP","env","model","Gest","Gse","Gt","Gp","Eest","Ese","Et","Ep","GxEest","GxEse","GxEt","GxEp","R2","f","f_p","aic","Gq","Eq"
"1","cg00321709","rs2253522","as","G+E",0.0580533932761888,0.0239975134978125,2.41914201992138,0.0177185616925284,-0.0290177347805974,0.0318083266972478,-0.91226850933684,0.36427086885983,NA,NA,NA,NA,0.187015257399016,3.13688757156459,0.0485443405429823,-144.907318078317,0.125619897320576,0.999999916659963
write.csv(female_gpe_model[!cpg %in% effect_cpgs_female & cpg %in% female_dmr_cpgs$V1,.SD[which.min(aic)],by=cpg])
"","cpg","SNP","env","model","Gest","Gse","Gt","Gp","Eest","Ese","Et","Ep","GxEest","GxEse","GxEt","GxEp","R2","f","f_p","aic","Gq","Eq"
"1","cg13936230","rs145250397","i_ochl","G+E",-0.0549101519808717,0.0243681514081827,-2.25335730483163,0.0265599504835312,-0.0212531946854929,0.0197306206492611,-1.07716807612379,0.284161139238183,NA,NA,NA,NA,0.301233628588254,3.22491090146271,0.0441947053023914,-343.999220896485,0.159955024077542,0.999963311701757
"2","cg16983110","rs199660637","f_dithiocarb","G+E",0.022621744695705,0.0148652543635723,1.52178658652086,0.131431730807005,-0.0455258214491602,0.0272285976561656,-1.67198553609137,0.100203526492318,NA,NA,NA,NA,0.237855348446725,2.84528030479223,0.0637630087123536,-413.975743988923,0.432244527651989,0.996752712113154
"3","cg17967134","rs79686435","cu","G+E",0.018840178696085,0.00784936934467966,2.40021559297054,0.0183546320044088,0.00682963791969456,0.00657489200728407,1.03874526184282,0.301766736871193,NA,NA,NA,NA,0.304873527059504,3.53479621946928,0.0331223962819726,-551.264331452279,0.12414800595362,0.999402328457499
"4","cg06257089","rs149658361","herb","G+E",-0.0542629596227739,0.0206900094135926,-2.62266481073349,0.0101779308535539,0.0470540360652374,0.0276610152626871,1.70109577028831,0.0922290922239561,NA,NA,NA,NA,0.312291377017157,4.96907641722427,0.00888219146671494,-228.456522092996,0.0798492094805621,0.99579965358805
"5","cg14871138","rs6090030","fong","G+E",0.0337490215263091,0.0140080153856828,2.40926502413776,0.0179321198252822,-0.0340365423435161,0.0191915095753036,-1.77352084837118,0.079379267996526,NA,NA,NA,NA,0.268097719499335,5.10215088690772,0.00787618953316936,-300.067018111743,0.121422743292129,0.999999134624592
"6","cg18279536","rs10130354","h_uree","G+E",0.0592219664886702,0.0219818497366706,2.69413025737661,0.00835955739594385,-0.0480955215933846,0.0316493390550712,-1.51963747203998,0.132086897604449,NA,NA,NA,NA,0.206626327580846,4.72632489851272,0.0110752318934497,-316.058798133275,0.0691339492265723,0.999806212053231
"7","cg00399951","rs62446596","h_uree","G+E",-0.0662288039486468,0.0268006001820052,-2.4711686864802,0.0152699381507597,0.0556781774881823,0.0379788669176214,1.46603050609572,0.147312263374215,NA,NA,NA,NA,0.137382489976555,3.60829810626794,0.0311530650871996,-291.743247541416,0.108948731466678,0.999806212053231
"8","cg02566259","rs17835422","h_uree","G+E",0.0528217620928637,0.024131710817379,2.18889421030286,0.031090319526506,0.117600285289307,0.0688713516756509,1.70753560701327,0.0990390772302754,NA,NA,NA,NA,0.18763576181294,3.35967720225723,0.0415208411272245,-199.764037812512,0.178787459280438,0.999806212053231
"9","cg03490759","rs17098912","fong","G+E",-0.0643103061706739,0.0264716866688911,-2.42939964404497,0.017022973178539,0.0589087851791854,0.0287441088575748,2.04942116908458,0.043205644572839,NA,NA,NA,NA,0.183058196993198,4.72258481847965,0.0111063294613034,-209.946148525262,0.116980015058284,0.999999134624592
"10","cg07057235","rs118090909","f_dithiocarb","G+E",-0.0686709532851203,0.0248333410088249,-2.76527243195819,0.00684561581384147,0.00964052903408147,0.0217913734483429,0.442401166541182,0.659395775417304,NA,NA,NA,NA,0.332753866521563,3.71948329597074,0.0279634760019859,-447.013347678189,0.0594558701197824,0.996752712113154
"11","cg06265072","rs77692359","ins","G+E",0.0618216988722497,0.0241245963540786,2.56260034219382,0.0119765598497406,0.0137305330329654,0.00923380325276981,1.48698566095685,0.140363484216842,NA,NA,NA,NA,0.199810632758657,4.84687731394561,0.00992146012826074,-431.370648837872,0.0902236543016555,0.992332674511371
"12","cg24626752","rs191220424","h_uree","G+E",0.195020812086321,0.0793833399307428,2.45669698776172,0.0158587275759534,-0.0605346396131514,0.049115199039481,-1.23250319243318,0.221927430246139,NA,NA,NA,NA,0.201677120626299,3.63289323497875,0.0304213283342781,-232.592854236364,0.111937725822534,0.999806212053231

is G effect generally more impactful/larger than E effect?

library(ggpubr)
male_tmp <- male_gpe_model
male_tmp$Sex <- "Male"
female_tmp <- female_gpe_model
female_tmp$Sex <- "Female"
male_female_gpe <- rbind(male_tmp, female_tmp)
male_female_max_gpe_effects <- melt(male_female_gpe[, .(G = max(abs(Gest)), E = max(abs(Eest))), by = c("cpg", "Sex")])
id.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns [cpg, Sex]. Consider providing at least one of 'id' or 'measure' vars in future.
cor.test(male_gpe_model$Gt, male_gpe_model$Et, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  male_gpe_model$Gt and male_gpe_model$Et
S = 4.9395e+18, p-value = 1.962e-08
alternative hypothesis: true rho is not equal to 0
sample estimates:
        rho
0.003190363 
cor.test(male_gpe_model$Gest, male_gpe_model$Eest, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  male_gpe_model$Gest and male_gpe_model$Eest
S = 4.9076e+18, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
        rho
0.009620696 
cor.test(female_gpe_model$Gt, female_gpe_model$Et, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  female_gpe_model$Gt and female_gpe_model$Et
S = 1.5629e+19, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho
0.01929246 
cor.test(female_gpe_model$Gest, female_gpe_model$Eest, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  female_gpe_model$Gest and female_gpe_model$Eest
S = 1.5626e+19, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho
0.01946726 
male_female_gpe[, .(G = max(abs(Gest)), E = max(abs(Eest)), Gq = Gq[which.max(abs(Gest))], Eq = Eq[which.max(abs(Eest))]), by = c("cpg", "Sex")]
male_female_max_gpe_effects_sig <- melt(male_female_gpe[, .(G = max(abs(Gest[Gq < 0.05])), E = max(abs(Eest[Eq < 0.05]))), by = c("cpg", "Sex")])[!is.infinite(value)]
no non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infid.vars and measure.vars are internally guessed when both are 'NULL'. All non-numeric/integer/logical type columns are considered id.vars, which in this case are columns [cpg, Sex]. Consider providing at least one of 'id' or 'measure' vars in future.
p1 <- ggboxplot(male_female_max_gpe_effects[Sex == "Male"], "variable", "value", fill = "Sex", palette = c("lightsteelblue2"), group = "variable") + stat_compare_means(comparisons = list(c("G", "E"))) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")

p2 <- ggboxplot(male_female_max_gpe_effects[Sex == "Female"], "variable", "value", fill = "Sex", palette = c("lightpink2"), group = "variable") + stat_compare_means(comparisons = list(c("G", "E"))) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")

p3 <- ggboxplot(male_female_max_gpe_effects_sig[Sex == "Male"], "variable", "value", fill = "Sex", palette = c("lightsteelblue2")) + stat_compare_means(comparisons = list(c("G", "E"))) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")


p4 <- ggboxplot(male_female_max_gpe_effects_sig[Sex == "Female"], "variable", "value", fill = "Sex", palette = c("lightpink2")) + stat_compare_means(comparisons = list(c("G", "E"))) + theme_classic() + theme(legend.position = "")
p4

cowplot::plot_grid(p1, p2, p3, nrow = 1, labels = "AUTO")

Same as previous but with t statistics


male_female_max_gpe_t <- melt(male_female_gpe[, .(Gt = max(abs(Gt)), Et = max(abs(Et))), by = c("cpg", "Sex")])

male_female_max_gpe_t_sig <- melt(male_female_gpe[, .(Gt = max(abs(Gt[Gq < 0.05])), Et = max(abs(Et[Eq < 0.05]))), by = c("cpg", "Sex")])[!is.infinite(value)]

p1 <- ggboxplot(male_female_max_gpe_t[Sex == "Male"], "variable", "value", fill = "Sex", palette = c("lightsteelblue2"), group = "variable") + stat_compare_means(comparisons = list(c("Gt", "Et"))) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")

p2 <- ggboxplot(male_female_max_gpe_t[Sex == "Female"], "variable", "value", fill = "Sex", palette = c("lightpink2"), group = "variable") + stat_compare_means(comparisons = list(c("Gt", "Et"))) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")

p3 <- ggboxplot(male_female_max_gpe_t_sig[Sex == "Male"], "variable", "value", fill = "Sex", palette = c("lightsteelblue2")) + stat_compare_means(comparisons = list(c("Gt", "Et"))) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")


p4 <- ggboxplot(male_female_max_gpe_t_sig[Sex == "Female"], "variable", "value", fill = "Sex", palette = c("lightpink2")) + stat_compare_means(comparisons = list(c("Gt", "Et"))) + theme_classic() + theme(legend.position = "")
p4
cowplot::plot_grid(p1, p2, p3, nrow = 1, labels = "AUTO")
mean(male_female_max_gpe_t[Sex == "Male" & variable == "Gt"]$value)
mean(male_female_max_gpe_t[Sex == "Male" & variable == "Et"]$value)
mean(male_female_max_gpe_t[Sex == "Female" & variable == "Gt"]$value)
mean(male_female_max_gpe_t[Sex == "Female" & variable == "Et"]$value)
male_female_gpe_all <- melt(male_female_gpe[, .(Gt = abs(Gt), Et = abs(Et)), by = c("cpg", "Sex", "env")])
ggboxplot(male_female_gpe_all[Sex == "Male"], "variable", "value", fill = "Sex", palette = c("lightsteelblue2"), group = "variable") + stat_compare_means(comparisons = list(c("Gt", "Et"))) + facet_wrap(~env) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")

ggboxplot(male_female_gpe_all[Sex == "Female"], "variable", "value", fill = "Sex", palette = c("lightpink2"), group = "variable") + stat_compare_means(comparisons = list(c("Gt", "Et"))) + facet_wrap(~env) + theme_classic() + theme(legend.position = "") + labs(x = "Variable", y = "|Effect|")

number of significant differences

z_scores_df <- male_female_gpe[, `:=`(Zge = (abs(Gest) - abs(Eest)) / sqrt(Gse^2 + Ese^2))]
p1 <- ggplot(z_scores_df, aes(Zge, fill = Sex)) +
  geom_histogram(bins = 100, position = "identity") +
  scale_fill_manual(values = c("lightpink2", "lightsteelblue2")) +
  theme_classic()
z_scores_df[, `:=`(Zgreaterp = pnorm(Zge))] # one-sided , E greater than G
z_scores_df[, `:=`(Zlessp = pnorm(-Zge))] # one-sided, G greater than E
z_scores_df[, `:=`(Zgreaterq = p.adjust(Zgreaterp, method = "BH")), by = "env"]
z_scores_df[, `:=`(Zlessq = p.adjust(Zlessp, method = "BH")), by = "env"]
#Two-sided
z_scores_df[, `:=`(Zp = 2*pnorm(-abs(Zge)))] # one-sided , E greater than G
z_scores_df[, `:=`(Zq = p.adjust(Zp,method="BH")),by="env"]

# z_scores_df[Zlessq < 0.05]
z_scores_df[Zlessq < 0.05, .(CpG = uniqueN(cpg)), by = c("env", "Sex")]
p2 <- ggplot(z_scores_df[Zlessq < 0.05, .(CpG = uniqueN(cpg)), by = c("env", "Sex")], aes(env, CpG, fill = Sex)) +
  geom_bar(stat = "identity", position = position_dodge(width = 1)) +
  geom_text(aes(label = CpG), size = 4,vjust=-0.5, stat = "identity", position = position_dodge(width = 1)) +
  scale_fill_manual(values = c("lightpink2", "lightsteelblue2")) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1))
p2

# ggplot(z_scores_df[Zgreaterq < 0.05, .(CpG = uniqueN(cpg)), by = c("env", "Sex")], aes(env, CpG, fill = Sex)) +
#   geom_bar(stat = "identity", position = "dodge") +
#   geom_text(aes(label = CpG), stat = "identity", position = "dodge") +
#   scale_fill_manual(values = c("lightpink2", "lightsteelblue2")) +
#   theme_classic() +
#   theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1))
# ggplot(z_scores_df[Zlessq < 0.05,.SD[which.max(abs(Zge))],by = c("cpg","env")],aes(env,fill = Sex)) +
#     geom_bar(stat = "count",position ="dodge")+
# geom_text(aes(label=..count..), stat="count")+
# scale_fill_manual(values = c("lightpink2","lightsteelblue2")) +
# theme_classic()
# ggplot(z_scores_df[Zgreaterq < 0.05,.SD[which.max(abs(Zge))],by = c("cpg","env")],aes(env,fill = Sex)) +
#     geom_bar(position = "dodge")+
#     geom_text(aes(label=..count..), stat="count")+
#     scale_fill_manual(values = c("lightpink2","lightsteelblue2")) +
#     theme_classic()
cowplot::plot_grid(p1, p2, labels = "AUTO", nrow = 1)

total_male <- nrow(z_scores_df[!duplicated(cpg) & Sex == "Male"])
total_female <- nrow(z_scores_df[!duplicated(cpg) & Sex == "Female"])
p3 <- ggplot(z_scores_df[, .(CpG = ifelse(Sex == "Male", total_male - uniqueN(cpg[Zlessq < 0.05]), total_female - uniqueN(cpg[Zlessq < 0.05]))), by = c("env", "Sex")], aes(env, CpG, fill = Sex)) +
  geom_bar(stat = "identity", position = position_dodge(width = 1)) +
  geom_text(aes(label = CpG), size = 4, vjust=-0.5, stat = "identity", position = position_dodge(width = 1)) +
  scale_fill_manual(values = c("lightpink2", "lightsteelblue2")) +
  theme_classic() +
  #ggtitle("No difference in either G or E effect") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1))
p1 

p2 + scale_y_continuous(limits=c(0,225))

p3 + scale_y_continuous(limits=c(0,925))

Difference in z scores males vs females

(tmp <- wilcox.test(z_scores_df[Sex == "Male" & Zq < 0.05]$Zge,z_scores_df[Sex == "Female" & Zq < 0.05]$Zge,alternative = "l"))

    Wilcoxon rank sum test with continuity correction

data:  z_scores_df[Sex == "Male" & Zq < 0.05]$Zge and z_scores_df[Sex == "Female" & Zq < 0.05]$Zge
W = 751464339, p-value < 2.2e-16
alternative hypothesis: true location shift is less than 0
tmp$p.value
[1] 5.945071e-17
(tmp <- t.test(z_scores_df[Sex == "Male" & Zq < 0.05]$Zge,z_scores_df[Sex == "Female" & Zq < 0.05]$Zge,alternative = "g"))

    Welch Two Sample t-test

data:  z_scores_df[Sex == "Male" & Zq < 0.05]$Zge and z_scores_df[Sex == "Female" & Zq < 0.05]$Zge
t = 12.82, df = 69546, p-value < 2.2e-16
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 0.1510096       Inf
sample estimates:
mean of x mean of y
 5.078683  4.905446 
tmp$p.value
[1] 7.019692e-38
(tmp <- wilcox.test(z_scores_df[Sex == "Male" & Zq < 0.05]$Zge,alternative = "g"))

    Wilcoxon signed rank test with continuity correction

data:  z_scores_df[Sex == "Male" & Zq < 0.05]$Zge
V = 798460741, p-value < 2.2e-16
alternative hypothesis: true location is greater than 0
tmp$p.value
[1] 0
(tmp <- wilcox.test(z_scores_df[Sex == "Female" & Zq < 0.05]$Zge,alternative = "g"))

    Wilcoxon signed rank test with continuity correction

data:  z_scores_df[Sex == "Female" & Zq < 0.05]$Zge
V = 758025516, p-value < 2.2e-16
alternative hypothesis: true location is greater than 0
tmp$p.value
[1] 0

What E effects overlap with G effect?

ggplot(melt(male_gpe_model[Eq < 0.05, .(Gest, Eest, cpg, SNP)]), aes(variable, abs(value), color = cpg)) +
  geom_point() +
  geom_line(aes(group = interaction(SNP, cpg))) +
  facet_wrap(~cpg)
ggboxplot(
  melt(male_gpe_model[Eq < 0.05, .(G = abs(Gest), E = abs(Eest), cpg, SNP)]),
  "variable",
  "value",
  facet.by = "cpg",
  fill = "lightsteelblue2"
) +
  stat_compare_means(comparisons = list(c("G", "E")), vjust = 1.1, tip.length = 0) +
  theme_classic()



ggplot(melt(male_gpe_model[Gq < 0.05 & Eq < 0.05, .(Gt, Et, cpg, SNP)]), aes(variable, abs(value), color = cpg)) +
  geom_point() +
  geom_line(aes(group = interaction(SNP, cpg))) +
  facet_wrap(~cpg)
ggboxplot(
  melt(male_gpe_model[Gq < 0.05 & Eq < 0.05, .(G = abs(Gt), E = abs(Et), cpg, SNP)]),
  "variable",
  "value",
  facet.by = "cpg",
  fill = "lightsteelblue2"
) +
  stat_compare_means(comparisons = list(c("G", "E")), vjust = 1.2, tip.length = ) +
  theme_classic() + labs(x = "Variable", y = "|Effect|")
ggplot(melt(male_gpe_model[Eq < 0.05, .(Gt, Et, cpg, SNP)]), aes(variable, abs(value), color = cpg)) +
  geom_point() +
  geom_line(aes(group = interaction(SNP, cpg))) +
  facet_wrap(~cpg)
ggboxplot(
  melt(male_gpe_model[Eq < 0.05, .(G = abs(Gt), E = abs(Et), cpg, SNP)]),
  "variable",
  "value",
  facet.by = "cpg",
  palette = c(),
  fill = "lightsteelblue2"
) +
  stat_compare_means(comparisons = list(c("G", "E")), vjust = 1.1, tip.length = 0) +
  theme_classic()



ggplot(melt(male_gpe_model[Gq < 0.05 & Eq < 0.05, .(Gt, Et, cpg, SNP)]), aes(variable, abs(value), color = cpg)) +
  geom_point() +
  geom_line(aes(group = interaction(SNP, cpg))) +
  facet_wrap(~cpg)
ggboxplot(
  melt(male_gpe_model[Gq < 0.05 & Eq < 0.05, .(G = abs(Gt), E = abs(Et), cpg, SNP)]),
  "variable",
  "value",
  facet.by = "cpg",
  fill = "lightsteelblue2"
) +
  stat_compare_means(comparisons = list(c("G", "E")), vjust = 1.2, tip.length = ) +
  theme_classic() + labs(x = "Variable", y = "|t|")

Which pesticides and which SNPs

unique(male_gpe_model[Eq < 0.05]$env)
unique(female_gpe_model[Eq < 0.05]$env)

male_gpe_model[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"]
female_gpe_model[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"]

males_pd_G <- males_pd[model == "G"]
males_pd_G$Gq <- p.adjust(males_pd_G$Gp, method = "BH")
females_pd_G <- females_pd[model == "G"]
females_pd_G$Gq <- p.adjust(females_pd_G$Gp, method = "BH")

males_pd_G[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"]
females_pd_G[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"]

model Ranking final results

Plot interaction for GxE in females

Replication of G models in DIPGD

female_g_digpd <- fread("female_digpd_pd_f_G_dnam_breakdown.txt.gz")
f_dmrs_digpd <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/DIGPD/sig.cpgs.DIGPD.F.csv")[, .SD[which.min(HMFDR)], by = "dmr"]
female_g_digpd[, `:=`(Gq = p.adjust(Gp, method = "BH"))]
sig_female_G_digpd <- merge(f_dmrs_digpd, female_g_digpd[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], by = "cpg")

male_g_digpd <- fread("male_digpd_pd_f_G_dnam_breakdown.txt.gz")
m_dmrs_digpd <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/DIGPD/sig.cpgs.DIGPD.M.csv")[, .SD[which.min(HMFDR)], by = "dmr"]
male_g_digpd[, `:=`(Gq = p.adjust(Gp, method = "BH"))]
sig_male_G_digpd <- merge(m_dmrs_digpd, male_g_digpd[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], by = "cpg")
female_overlap_G <- merge(females_pd_G[Gq < 0.05], female_g_digpd[Gq < 0.05], by = c("cpg", "SNP"))
female_overlap_G_min_snp <- merge(females_pd_G[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], female_g_digpd[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], by = c("cpg", "SNP"))
female_overlap_G_cpg <- merge(females_pd_G[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], female_g_digpd[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], by = c("cpg"))
female_overlap_G # SNP-CpG pairs significant in both cohorts
female_overlap_G_min_snp # overlap in minimum significant SNP per CpG in cohorts
female_overlap_G_cpg # overlap in CpGs with significant SNP between cohorts
sig_female_G_digpd # Representative DMRs for DIGPD with a significant G effect


male_overlap_G <- merge(males_pd_G[Gq < 0.05], male_g_digpd[Gq < 0.05], by = c("cpg", "SNP"))
male_overlap_G_min_snp <- merge(males_pd_G[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], male_g_digpd[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], by = c("cpg", "SNP"))
male_overlap_G_cpg <- merge(males_pd_G[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], male_g_digpd[Gq < 0.05, .SD[which.min(Gq)], by = "cpg"], by = c("cpg"))
male_overlap_G
male_overlap_G_min_snp
male_overlap_G_cpg
sig_male_G_digpd

Plot out overlap

sig_female_G_digpd[cpg %in% female_overlap_G_cpg$cpg]
library(VennDiagram)
venn.diagram(
  x = list(
    unique(females_pd_G[Gq < 0.05]$cpg),
    unique(female_g_digpd[Gq < 0.05]$cpg),
    unique(males_pd_G[Gq < 0.05]$cpg),
    unique(male_g_digpd[Gq < 0.05]$cpg)
  ),
  category.names = c("TERRE Females", "DIGPD Females", "TERRE males", "DIGPD males"),
  filename = "terre_digpd_cpg_overlap_G.png",
  output = TRUE,
  imagetype = "png",
  height = 480,
  width = 480,
  resolution = 300,
  compression = "lzw",
  lwd = 1,
  col = c("#eea2adff", "#8b5f65ff", "#bcd2eeff", "#6e7b8bff"),
  fill = c(alpha("#eea2adff", 0.3), alpha("#8b5f65ff", 0.3), alpha("#bcd2eeff", 0.3), alpha("#6e7b8bff", 0.3)),
  cex = 0.5,
  fontfamily = "sans",
  cat.cex = 0.3,
  cat.default.pos = "outer",
  cat.pos = c(-27, 27, -27, 27),
  cat.dist = c(0.055, 0.055, 0.055, 0.055),
  cat.fontfamily = "sans"
  #         cat.col = c("#440154ff", '#21908dff'),
  #         rotation = 1
)


venn.diagram(
  x = list(
    unique(females_pd_G[, .SD[all(Gq > 0.05)], by = "cpg"]$cpg),
    unique(female_g_digpd[, .SD[all(Gq > 0.05)], by = "cpg"]$cpg),
    unique(males_pd_G[, .SD[all(Gq > 0.05)], by = "cpg"]$cpg),
    unique(male_g_digpd[, .SD[all(Gq > 0.05)], by = "cpg"]$cpg)
  ),
  category.names = c("TERRE Females", "DIGPD Females", "TERRE males", "DIGPD males"),
  filename = "terre_digpd_cpg_overlap_no_G.png",
  output = TRUE,
  imagetype = "png",
  height = 480,
  width = 480,
  resolution = 300,
  compression = "lzw",
  lwd = 1,
  col = c("#eea2adff", "#8b5f65ff", "#bcd2eeff", "#6e7b8bff"),
  fill = c(alpha("#eea2adff", 0.3), alpha("#8b5f65ff", 0.3), alpha("#bcd2eeff", 0.3), alpha("#6e7b8bff", 0.3)),
  cex = 0.5,
  fontfamily = "sans",
  cat.cex = 0.3,
  cat.default.pos = "outer",
  cat.pos = c(-27, 27, -27, 27),
  cat.dist = c(0.055, 0.055, 0.055, 0.055),
  cat.fontfamily = "sans"
  #         cat.col = c("#440154ff", '#21908dff'),
  #         rotation = 1
)
library(fastSave)
cur_env <- Sys.getenv("PATH")
Sys.setenv(PATH = paste(cur_env, "/home1/NEURO/casazza/miniconda3/bin", sep = ":"))
# save.image.lbzip2(n.cores=16)
load.lbzip2(".RDataFS",n.cores=32)

mQTL replication

sig_terre_m <- fread("/home1/NEURO/casazza/prs_ewas_integration/cis_mQTL_analyses/terre_data/male_cis_mqtl_PD_CTP_sig.txt.gz")
|--------------------------------------------------|
|==================================================|
sig_terre_f <- fread("/home1/NEURO/casazza/prs_ewas_integration/cis_mQTL_analyses/terre_data/female_cis_mqtl_PD_CTP_sig.txt.gz")
|--------------------------------------------------|
|==================================================|
sig_terre <- fread("/home1/NEURO/casazza/prs_ewas_integration/cis_mQTL_analyses/terre_data/cis_mqtl_PD_CTP_sig.txt.gz")
|--------------------------------------------------|
|==================================================|
# digpd_all <- fread("/home1/NEURO/casazza/prs_ewas_integration/cis_mQTL_analyses/digpd_data/cis_all_impute_mQTL_results_CTP.txt")
digpd_m <- fread("/home1/NEURO/casazza/prs_ewas_integration/cis_mQTL_analyses/digpd_data/male_cis_all_impute_mQTL_results_PD_CTP_no_mut.txt.gz")
|--------------------------------------------------|
|==================================================|
digpd_f <- fread("/home1/NEURO/casazza/prs_ewas_integration/cis_mQTL_analyses/digpd_data/female_cis_all_impute_mQTL_results_PD_CTP_no_mut.txt.gz")
|--------------------------------------------------|
|==================================================|
# merged <- merge(sig_terre, digpd_all, by = c("SNP", "gene"))
merged_f <- merge(sig_terre_f, digpd_f, by = c("SNP", "gene"))
merged_m <- merge(sig_terre_m, digpd_m, by = c("SNP", "gene"))
# length(merged$`FDR.y`)
# sum(merged$`FDR.y` < 0.05)
#
# sum(merged$`FDR.y` < 0.05) / length(merged$`FDR.y`)
#
# nrow(merged[FDR.y < 0.05, .SD[which.min(`p-value.y`)], by = "gene"])
# length(unique(merged$gene))
# nrow(merged[FDR.y < 0.05, .SD[which.min(`p-value.y`)], by = "gene"]) / length(unique(merged$gene))



length(merged_f$`FDR.y`)
[1] 5286181
sum(merged_f$`FDR.y` < 0.05)
[1] 2615686
sum(merged_f$`FDR.y` < 0.05) / length(merged_f$`FDR.y`)
[1] 0.4948158
nrow(merged_f[FDR.y < 0.05, .SD[which.min(`p-value.y`)], by = "gene"])
source("~/pi0.tst.R")
library(multtest)
1 - pi0.tst(merged_f$`p-value.y`)
[1] 0.8194137
1 - pi0.tst(merged_m$`p-value.y`)
[1] 0.8484302

DMRs in either dataset with a significant genetic effect in both datasets

(terre_f_dmr <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/TERRE/sig.cpgs.TERRE.F.HT.ancestry.csv"))
nrow(terre_f_dmr[threshold== TRUE])
[1] 201
(terre_m_dmr <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/TERRE/sig.cpgs.TERRE.M.HT.ancestry.csv"))
nrow(terre_m_dmr[threshold== TRUE])
[1] 53
(digpd_f_dmr <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/DIGPD/sig.cpgs.DIGPD.F.noGBA.csv"))
nrow(digpd_f_dmr[threshold== TRUE])
[1] 94
(digpd_m_dmr <- fread("/home1/NEURO/SHARE_DECIPHER/DMRs/DIGPD/sig.cpgs.DIGPD.M.nomut.csv"))
nrow(digpd_m_dmr[threshold== TRUE])
[1] 25
get_sig_dmr <- function(dmr_table, mqtl_dt){
  mQTLs <- mqtl_dt[dmr_table$cpg,on="gene",nomatch=0]
  res<- mQTLs[FDR < 0.05,.SD[which.min(`p-value`)],by="gene"]
  dmrs <- unique(dmr_table[res$gene,on="cpg"]$dmr)
  genes <- unique(dmr_table[res$gene,on="cpg"]$genes)
  res <- list(res=res,dmr=dmrs,genes=genes)
  return(res)
}
res1 <- get_sig_dmr(terre_f_dmr[sig_terre_f[FDR < 0.05]$gene, on="cpg",nomatch=0],digpd_f)
res2 <- get_sig_dmr(terre_m_dmr[sig_terre_m[FDR < 0.05]$gene, on="cpg",nomatch=0],digpd_m)

res3 <- get_sig_dmr(digpd_f_dmr[digpd_f[FDR < 0.05]$gene, on="cpg",nomatch=0],sig_terre_f)
res4 <- get_sig_dmr(digpd_m_dmr[digpd_m[FDR < 0.05]$gene, on="cpg",nomatch=0],sig_terre_m)

print(length(unique(res1$dmr)))
[1] 77
print(length(unique(res2$dmr)))
[1] 51
print(length(unique(res3$dmr)))
[1] 203
print(length(unique(res4$dmr)))
[1] 30
print(length(unique(res1$res$gene)))
[1] 277
print(length(unique(res2$res$gene)))
[1] 199
print(length(unique(res3$res$gene)))
[1] 423
print(length(unique(res4$res$gene)))
[1] 118
print(unique(res1$genes))
 [1] "TMEM116;TMEM116;TMEM116;TMEM116;TMEM116"
 [2] ""
 [3] "SOX30;SOX30"
 [4] "CRACR2A;CRACR2A"
 [5] "PM20D1"
 [6] "PM20D1;PM20D1"
 [7] "HLA-DRB5"
 [8] "UBXN6;UBXN6"
 [9] "SOX30;SOX30;SOX30"
[10] "GSTM5"
[11] "RNF166;RNF166;RNF166"
[12] "FABP6;FABP6"
[13] "CSGALNACT1;CSGALNACT1;CSGALNACT1"
[14] "LY6D"
[15] "IRF6"
[16] "SOX30;SOX30;SOX30;SOX30"
[17] "HLA-C"
[18] "MPRIP;MPRIP"
[19] "UMODL1;UMODL1;UMODL1;UMODL1"
[20] "LOC100049716;NINJ2;NINJ2"
[21] "NINJ2"
[22] "ERGIC1"
[23] "ACTL9"
[24] "MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG"
[25] "CBFA2T3"
[26] "TRAK1;TRAK1"
[27] "GSTM5;GSTM5"
[28] "IRF6;IRF6"
[29] "HOOK2;HOOK2"
[30] "TRAK1"
[31] "ABCG2"
[32] "IL6"
[33] "DNHD1"
[34] "VENTXP1"
[35] "PGAM2"
[36] "CTNNBL1;CTNNBL1"
[37] "PTGFRN"
[38] "DGKG;DGKG;DGKG"
[39] "TAPBP;TAPBP;TAPBP;ZBTB22;ZBTB22"
[40] "ZNF718;ZNF718;ZNF595;ZNF595"
[41] "TGM3"
[42] "ISM1"
[43] "PTPRN2;PTPRN2;PTPRN2;PTPRN2;PTPRN2"
[44] "CCHCR1;CCHCR1;TCF19;TCF19;CCHCR1"
[45] "SH3BP2;SH3BP2;SH3BP2;SH3BP2"
[46] "TCF19;TCF19;CCHCR1"
[47] "CDSN;PSORS1C1"
[48] "ACOX3;ACOX3"
[49] "TRAPPC9;TRAPPC9"
[50] "ZBTB22;TAPBP;TAPBP;TAPBP;ZBTB22"
[51] "LOC441666"
[52] "ARHGAP18"
[53] "SNCG;MMRN2"
[54] "UMODL1;UMODL1;UMODL1;UMODL1;UMODL1;UMODL1;UMODL1;UMODL1"
[55] "BET1L;BET1L"
[56] "MMRN2;SNCG;SNCG"
[57] "LIPA;LIPA"
[58] "SNCG;SNCG;MMRN2"
[59] "LGALS8;LGALS8;LGALS8;LGALS8"
[60] "LIPA;LIPA;LIPA"
[61] "PPAP2C;PPAP2C;PPAP2C"
[62] "LGALS8;LGALS8-AS1;LGALS8;LGALS8;LGALS8"
[63] "EPHA2"
[64] "SLC1A7"
[65] "SPSB1"
[66] "SMC4;SMC4;SMC4;SMC4;SMC4;SMC4"
[67] "CDH22"
[68] "F11-AS1"
[69] "TXNRD2;TXNRD2;COMT"
[70] "ISG15"
[71] "H1F0"
[72] "PPARGC1A"
[73] "LOC399959;MIR125B1"
[74] "HEY2"
[75] "LGALS8;LGALS8;LGALS8;LGALS8-AS1;LGALS8"
[76] "MYF5;MYF5"
[77] "TXNRD1;TXNRD1;TXNRD1;EID3;TXNRD1;TXNRD1"                
print(unique(res2$genes))
 [1] "DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA"
 [2] "MUPCDH;MUPCDH"
 [3] "CHORDC1;CHORDC1"
 [4] "ZNF718;ZNF718;ZNF718;ZNF718;ZNF718;ZNF718"
 [5] "ZNF718"
 [6] ""
 [7] "NPPA"
 [8] "HLA-DPB2"
 [9] "KIAA1530"
[10] "GABBR1;GABBR1;GABBR1"
[11] "UTS2B;CCDC50;CCDC50"
[12] "PAX8;PAX8;PAX8;PAX8;PAX8;LOC440839;LOC654433"
[13] "FCN2;FCN2"
[14] "SLFN12"
[15] "SLFN12;SLFN12"
[16] "BST2"
[17] "BST2;MVB12A;BISPR;BISPR"
[18] "PAX8-AS1;PAX8-AS1;PAX8;PAX8;PAX8;PAX8"
[19] "MAEA;MAEA"
[20] "BCL2L14;BCL2L14;BCL2L14"
[21] "RALGDS"
[22] "MAEA;MAEA;MAEA;MAEA;MAEA;MAEA;MAEA"
[23] "BISPR;BISPR;BST2;MVB12A"
[24] "BCL2L14;BCL2L14;BCL2L14;BCL2L14;BCL2L14"
[25] "PLEKHH2;LOC728819"
[26] "PAX8;PAX8;LOC654433;PAX8;PAX8;PAX8;LOC440839"
[27] "B3GALT4"
[28] "TCEA2;TCEA2"
[29] "C14orf64"
[30] "RGMA;RGMA;RGMA;RGMA;RGMA;RGMA"
[31] "DDR1;DDR1;DDR1"
[32] "ACSL5;ACSL5;ACSL5"
[33] "CCDC155;CCDC155"
[34] "CCDC155"
[35] "UTS2D;CCDC50;CCDC50"
[36] "HDAC4"
[37] "ACSL5;ACSL5;ACSL5;ACSL5"
[38] "TMEM184A"
[39] "BCL2L14;BCL2L14;BCL2L14;BCL2L14"
[40] "RNF5P1;RNF5;AGPAT1"
[41] "NHEDC2"
[42] "FBXO43;FBXO43;FBXO43"
[43] "DCPS"
[44] "TCEA2"
[45] "RGMA;RGMA;RGMA;RGMA;RGMA;RGMA;RGMA"
[46] "PTH1R"
[47] "CCSAP"
[48] "DZIP1L;DZIP1L"
[49] "RAET1E-AS1;LRP11"                                           
print(unique(res3$genes))
  [1] "POU1F1;POU1F1"
  [2] ""
  [3] "ROCK2"
  [4] "PLEC1;PLEC1;PLEC1;PLEC1;PLEC1;PLEC1;PLEC1;PLEC1"
  [5] "FAM59B"
  [6] "TP53INP1;TP53INP1"
  [7] "IFNAR1;IFNAR1"
  [8] "RGS12;RGS12;RGS12"
  [9] "NUB1;NUB1"
 [10] "NCAM1;NCAM1;NCAM1;NCAM1;NCAM1"
 [11] "NPAS3;NPAS3;NPAS3;NPAS3"
 [12] "ADCY4"
 [13] "PLEC;PLEC;PLEC;PLEC;PLEC;PLEC;PLEC;PLEC"
 [14] "LINC00879"
 [15] "CTBP1;CTBP1;C4orf42"
 [16] "SLC44A4"
 [17] "SMAD5-AS1;SMAD5;SMAD5;SMAD5"
 [18] "GFM2;GFM2;GFM2;GFM2;GFM2"
 [19] "SLC12A4;SLC12A4;SLC12A4;SLC12A4;SLC12A4"
 [20] "IFNA13"
 [21] "ITGAD"
 [22] "TNS3"
 [23] "HDDC2"
 [24] "SLC7A5"
 [25] "TTYH1;TTYH1;TTYH1"
 [26] "C10orf71;C10orf71"
 [27] "ACSF3;ACSF3;ACSF3;ACSF3;ACSF3"
 [28] "TMEM72-AS1"
 [29] "KIF16B;KIF16B;KIF16B"
 [30] "MAPKSP1;MAPKSP1"
 [31] "CSGALNACT2"
 [32] "ITGAD;ITGAD"
 [33] "SRC"
 [34] "ITGAM;ITGAM"
 [35] "SNORD114-10"
 [36] "ZCCHC8"
 [37] "GAREML;GAREML"
 [38] "CTR9"
 [39] "HOXA4"
 [40] "BEGAIN"
 [41] "ARHGEF10"
 [42] "CLEC3B"
 [43] "MAP3K9"
 [44] "MAP3K9;MAP3K9"
 [45] "HOXA4;HOXA4"
 [46] "MOCS1;MOCS1"
 [47] "CSMD3;CSMD3;CSMD3"
 [48] "RPAP3;RPAP3;RPAP3"
 [49] "GSPT1;GSPT1;GSPT1"
 [50] "MKLN1;MKLN1"
 [51] "ZXDC;ZXDC"
 [52] "PYGL;PYGL"
 [53] "PLCZ1"
 [54] "LOC101928767"
 [55] "HIVEP3;HIVEP3;HIVEP3;HIVEP3"
 [56] "F11R"
 [57] "ZIK1"
 [58] "HIVEP3;HIVEP3"
 [59] "DIRC1"
 [60] "HIVEP3;HIVEP3;HIVEP3;HIVEP3;HIVEP3;HIVEP3"
 [61] "MTTP;TRMT10A;TRMT10A;MTTP"
 [62] "HIBADH"
 [63] "ITPR2"
 [64] "B3GALT2;CDC73"
 [65] "C4orf42;CTBP1;CTBP1"
 [66] "TMEM165;TMEM165"
 [67] "C12orf73"
 [68] "ARHGEF10;ARHGEF10;ARHGEF10"
 [69] "SVIP"
 [70] "SNORD114-10;SNORD114-9"
 [71] "KIF16B"
 [72] "MSRB1"
 [73] "CACNG4"
 [74] "DLG2"
 [75] "RIMS1;RIMS1;RIMS1"
 [76] "LOC100129697;CBFA2T3;CBFA2T3"
 [77] "EMC2"
 [78] "ST8SIA6"
 [79] "MUC20"
 [80] "LRRC2;TDGF1"
 [81] "CRY2;CRY2"
 [82] "GLB1L;GLB1L;GLB1L"
 [83] "SNORD113-7"
 [84] "SECTM1"
 [85] "COX7B2"
 [86] "CCDC149;CCDC149"
 [87] "RIMS1;RIMS1;RIMS1;RIMS1;RIMS1"
 [88] "TTN;TTN;TTN;MIR548N;TTN"
 [89] "SLITRK6"
 [90] "LOC285830;LOC285830"
 [91] "C10orf71-AS1;C10orf71"
 [92] "KIF12;KIF12"
 [93] "SOX5;SOX5"
 [94] "CNN1"
 [95] "HS3ST3A1;HS3ST3A1"
 [96] "MYO3B;MYO3B;MYO3B"
 [97] "BLCAP;BLCAP;BLCAP;BLCAP;NNAT;NNAT;BLCAP"
 [98] "TMEM41B;TMEM41B;TMEM41B"
 [99] "CDH18;CDH18"
[100] "MANEA"
[101] "KIF12"
[102] "OMG;NF1;NF1"
[103] "TDRD9"
[104] "ADAM2"
[105] "ADGB"
[106] "MFI2-AS1;MFI2"
[107] "PIP5K1B;PIP5K1B"
[108] "CTNND2;CTNND2;CTNND2;CTNND2;CTNND2"
[109] "DMP1;DMP1"
[110] "CECR5;CECR4;CECR4;CECR5"
[111] "TCN2"
[112] "NEDD1;NEDD1;NEDD1;NEDD1"
[113] "RGMA;RGMA;RGMA;RGMA;RGMA;RGMA"
[114] "AURKC;AURKC;AURKC"
[115] "DUXA"
[116] "CNN1;CNN1"
[117] "GRIK2;GRIK2;GRIK2"
[118] "GLB1L;GLB1L;GLB1L;GLB1L"
[119] "ZNF568;ZNF568"
[120] "MS4A4A"
[121] "KLHDC4;KLHDC4;KLHDC4"
[122] "CASR;CASR"
[123] "ZBTB20;ZBTB20-AS1;ZBTB20;ZBTB20;ZBTB20;ZBTB20;ZBTB20;ZBTB20;ZBTB20"
[124] "LOC101929680;SCN1A"
[125] "FAM101A"
[126] "FLJ34503"
[127] "CNN1;CNN1;CNN1;CNN1;CNN1;CNN1"
[128] "AURKC;AURKC;AURKC;AURKC;AURKC"
[129] "VGLL4;VGLL4"
[130] "GLB1L;GLB1L;GLB1L;GLB1L;GLB1L"
[131] "SOX5"
[132] "KIAA1524"
[133] "REV3L;REV3L;REV3L;TRAF3IP2-AS1;TRAF3IP2-AS1;TRAF3IP2-AS1;TRAF3IP2-AS1"
[134] "GLB1L"
[135] "CASC6"
[136] "RDX"
[137] "CASR"
[138] "MYRFL"
[139] "BANK1;BANK1;BANK1"
[140] "SLC44A4;SLC44A4"
[141] "SERPINB5"
[142] "ACBD4;ACBD4;ACBD4;ACBD4"
[143] "TGIF1;TGIF1;TGIF1;TGIF1;TGIF1;TGIF1;TGIF1;TGIF1"
[144] "GLRX5;SNHG10;SNHG10"
[145] "KRTAP19-2"
[146] "CECR5;CECR5;CECR5-AS1;CECR5-AS1"
[147] "SOX6;SOX6;SOX6;SOX6"
[148] "DYRK1A;DYRK1A;DYRK1A;DYRK1A"
[149] "BMP2K;BMP2K"
[150] "FAM19A5;FAM19A5"
[151] "ZSCAN18;ZSCAN18"
[152] "TMEM85"
[153] "ELP2P;GEMIN4"
[154] "LINC01007"
[155] "SLC6A18"
[156] "WDR17;WDR17"
[157] "C10orf116;AGAP11;AGAP11"
[158] "CENPBD1;AFG3L1;CENPBD1;AFG3L1;AFG3L1"
[159] "LYZ"
[160] "CLASP2;CLASP2"
[161] "RGMA;RGMA;RGMA;RGMA;RGMA;RGMA;RGMA"
[162] "KLRF2"
[163] "OR8G5;OR8G1"
[164] "TCN2;TCN2;PES1;PES1;PES1;PES1"
[165] "TCN2;TCN2;TCN2;TCN2;PES1;PES1"
[166] "ALB"
[167] "BLCAP;NNAT;BLCAP;BLCAP;BLCAP;BLCAP;NNAT"
[168] "PBX2"
[169] "ANKRD62"
[170] "CNOT2;CNOT2;CNOT2;CNOT2"
[171] "ZMYM2;ZMYM2;ZMYM2;ZMYM2"
[172] "OXTR"
[173] "KCNAB3"
[174] "ERBB4;ERBB4"
[175] "B3GALNT1;B3GALNT1;B3GALNT1;B3GALNT1;B3GALNT1"
[176] "FBXW7;FBXW7;FBXW7"
[177] "ZBTB20;ZBTB20;ZBTB20;ZBTB20;ZBTB20;ZBTB20;ZBTB20"
[178] "ANO3"
[179] "FRMD3;FRMD3"
[180] "PAPOLA;PAPOLA;PAPOLA;PAPOLA"
[181] "LINC01194"
[182] "TFPI2"
[183] "COL4A1"
[184] "GUCY1B2"
[185] "EPHA5;EPHA5"
[186] "FAM115A"
[187] "GORASP2"
[188] "NPY5R"
[189] "PLSCR5"
[190] "NNAT;NNAT;BLCAP;NNAT;BLCAP;NNAT;BLCAP;BLCAP;BLCAP"
[191] "PLA2G16;PLA2G16"
[192] "A1CF;A1CF;A1CF;A1CF;A1CF;A1CF"
[193] "BEGAIN;BEGAIN"
[194] "TSGA10;TSGA10"
[195] "DIP2C"
[196] "CTNND2"
[197] "MDGA2;MDGA2"
[198] "NPFFR2;NPFFR2;NPFFR2"                                                 
print(unique(res4$genes))
 [1] "FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2"
 [2] ""
 [3] "C1orf109"
 [4] "LOC254896"
 [5] "CHMP7"
 [6] "GALR1;GALR1"
 [7] "TRIM15;TRIM15"
 [8] "ADAMTS14;ADAMTS14"
 [9] "CNKSR1;CNKSR1"
[10] "CNKSR1;CNKSR1;CNKSR1"
[11] "TRIM15"
[12] "SLC20A1"
[13] "FAM134B;LOC101929524"
[14] "FAM134B"
[15] "GALR1"
[16] "SCHIP1;IQCJ-SCHIP1;IQCJ-SCHIP1;SCHIP1;SCHIP1;SCHIP1"
[17] "C7orf49;C7orf49;C7orf49;C7orf49;C7orf49;C7orf49;C7orf49;C7orf49;C7orf49"
[18] "SCHIP1"
[19] "ZFR2"
[20] "SCHIP1;SCHIP1;IQCJ-SCHIP1;IQCJ-SCHIP1;SCHIP1;SCHIP1;SCHIP1"
[21] "CDCA8;C1orf109"
[22] "PHGDH"
[23] "C7orf49;C7orf49;C7orf49"
[24] "CCDC105"
[25] "LAX1;LAX1"
[26] "SLC1A5;SLC1A5;SLC1A5"
[27] "PKD2L2"
[28] "ANGPT2;ANGPT2;ANGPT2;ANGPT2;ANGPT2;ANGPT2;MCPH1"
[29] "GPR35;GPR35;GPR35"
[30] "DPEP1"
[31] "CCDC105;CCDC105"
[32] "CHMP7;CHMP7"
[33] "RARRES2"
[34] "CCDC105;SLC1A6"                                                         

res1 <- get_sig_dmr(terre_f_dmr[sig_terre_f[FDR < 0.05]$gene, on="cpg",nomatch=0][threshold == TRUE],digpd_f)
res2 <- get_sig_dmr(terre_m_dmr[sig_terre_m[FDR < 0.05]$gene, on="cpg",nomatch=0][threshold == TRUE],digpd_m)

res3 <- get_sig_dmr(digpd_f_dmr[digpd_f[FDR < 0.05]$gene, on="cpg",nomatch=0][threshold == TRUE],sig_terre_f)
res4 <- get_sig_dmr(digpd_m_dmr[digpd_m[FDR < 0.05]$gene, on="cpg",nomatch=0][threshold == TRUE],sig_terre_m)

print(length(unique(res1$dmr)))
[1] 23
print(length(unique(res2$dmr)))
[1] 10
print(length(unique(res3$dmr)))
[1] 11
print(length(unique(res4$dmr)))
[1] 3
print(length(unique(res1$res$gene)))
[1] 107
print(length(unique(res2$res$gene)))
[1] 42
print(length(unique(res3$res$gene)))
[1] 28
print(length(unique(res4$res$gene)))
[1] 15
print(unique(res1$genes))
 [1] ""
 [2] "CRACR2A;CRACR2A"
 [3] "PM20D1"
 [4] "PM20D1;PM20D1"
 [5] "GSTM5"
 [6] "CSGALNACT1;CSGALNACT1;CSGALNACT1"
 [7] "MPRIP;MPRIP"
 [8] "LOC100049716;NINJ2;NINJ2"
 [9] "NINJ2"
[10] "MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG;MOG"
[11] "CBFA2T3"
[12] "GSTM5;GSTM5"
[13] "HOOK2;HOOK2"
[14] "ABCG2"
[15] "DNHD1"
[16] "PGAM2"
[17] "TRAPPC9;TRAPPC9"
[18] "LOC441666"
[19] "ARHGAP18"
[20] "LIPA;LIPA"
[21] "LIPA;LIPA;LIPA"
[22] "SMC4;SMC4;SMC4;SMC4;SMC4;SMC4"
[23] "F11-AS1"                                    
print(unique(res2$genes))
[1] "DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA;DTNA"
[2] "ZNF718;ZNF718;ZNF718;ZNF718;ZNF718;ZNF718"
[3] "ZNF718"
[4] ""
[5] "PAX8;PAX8;PAX8;PAX8;PAX8;LOC440839;LOC654433"
[6] "PAX8-AS1;PAX8-AS1;PAX8;PAX8;PAX8;PAX8"
[7] "PAX8;PAX8;LOC654433;PAX8;PAX8;PAX8;LOC440839"
[8] "CCDC155;CCDC155"
[9] "CCDC155"                                                    
print(unique(res3$genes))
 [1] ""                              "NPAS3;NPAS3;NPAS3;NPAS3"
 [3] "TNS3"                          "TTYH1;TTYH1;TTYH1"
 [5] "TMEM72-AS1"                    "GLB1L;GLB1L;GLB1L"
 [7] "MYO3B;MYO3B;MYO3B"             "GLB1L;GLB1L;GLB1L;GLB1L"
 [9] "GLB1L;GLB1L;GLB1L;GLB1L;GLB1L" "GLB1L"
[11] "TMEM85"                        "DIP2C"                        
print(unique(res4$genes))
[1] "FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2;FGFR2"
[2] ""                                                     

####Permutation testing Select random sets CpG sites of same size for dataset and test replication (i.e. is the replication in which sets of CpG sites have an mQTL more or less than expected by chances):

  1. Take all CpG sites in both data sets
  2. get a subset of __ CpGs in males and __ CpGs in females for TERRE, __ CpGs in males and __ CpGs in females for TERRE for DIGPD
  3. get which CpG has an mQTL at FDR < 0.05
  4. count overlap in DMRs between datasets
  5. repeat 1000 Times and plot distribution of replication
epic_cpgs <- fread("~/MethylationEPIC_v-1-0_B4.csv", skip = 7, fill = TRUE)$Name
male_n <- uniqueN(male_gpe_model$cpg)
female_n <- uniqueN(female_gpe_model$cpg)
m_dmrs_digpd
LS0tCnRpdGxlOiAiRXhwbG9yaW5nIFRlcnJlIFBhcmtpbnNvbidzIERNUnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZGF0YS50YWJsZSkKU3lzLnNldGxvY2FsZSgiTENfTUVTU0FHRVMiLCAiZW5fVVMudXRmOCIpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgY2FjaGUgPSBGQUxTRSwgZXZhbCA9IFRSVUUsIGF1dG9kZXAgPSBUUlVFKQpgYGAKCiMgQW5hbHlzaXMgcGxhbgoqR29hbDoqIENoYXJhY3Rlcml6ZSBQYXJraW5zb24ncyBhc3NvY2lhdGVkIEROQSBtZXRoeWxhdGlvbiBhcyBhIGNvbWJpbmF0aW9uIG9mIGdlbmV0aWMgYW5kIGVudmlyb25tZW50YWwgZmFjdG9ycy4gVGhpcyBpbmNsdWRlczoKMS4gSGVyaXRhYmlsaXR5IG9mIERNUiB0YWdDcEdzIGluIHJlbGF0aW9uIHRvIGFsbCBDcEcgc2l0ZXMKMi4gQSBtb2RlbCByYW5raW5nIHNjaGVtZSBmb3IgU05QIGFzc29jaWF0aW9uIGluIGNpcyBhbmQgRSBldmVudHMKMy4gUmVsYXRpb25zaGlwLCBpZiBhbnksIGJldHdlZW4gcGF0dGVybnMgb2JzZXJ2ZWQgaW4gcmFua2luZyB3aXRoIG51bWJlciBvZiBTTlBzIGluIGNpcyB0byBDcEcgc2l0ZQoKIyMgTW9kZWwgUmFua2luZwpJJ3ZlIHNldCB1cCBteSBjb2RlIHRvIHRha2UgaW4gQ3BHIHNpdGVzIGFuZCBgbWF0cml4RVFUTGAgZm9ybWF0dGVkIGdlbmV0aWMgYW5kIGV4cHJlc3Npb24gZGF0YS4gSGVyZSBJIHdpbGwgbG9hZCBpbiBETVJzIHByaW9yIHRvIHNldHRpbmcgYHJhbmtfY2lzX2NwZ19tb2RlbHNgIHJ1bm5pbmc6CmBgYHtyfQpoZXJpdGFiaWxpdHkgPC0gZnJlYWQoInRlcnJlX2hlcml0YWJpbGl0eV8xNTBrYl9tdmFsdWUudHh0IikKKGZfZG1ycyA8LSBmcmVhZCgiL2hvbWUxL05FVVJPL1NIQVJFX0RFQ0lQSEVSL0RNUnMvVEVSUkUvc2lnLmNwZ3MuVEVSUkUuRi5IVC5hbmNlc3RyeS5jc3YiKSkKKG1fZG1ycyA8LSBmcmVhZCgiL2hvbWUxL05FVVJPL1NIQVJFX0RFQ0lQSEVSL0RNUnMvVEVSUkUvc2lnLmNwZ3MuVEVSUkUuTS5IVC5hbmNlc3RyeS5jc3YiKSkKCnN1bShmX2RtcnMkY3BnICVpbiUgbV9kbXJzJGNwZykgIyBvdmVybGFwIGJldHdlZW4gTSBhbmQgRgoKIyBudW0gaGVyaXRhYmxlIGluIGNpcwpzdW0obV9kbXJzJGNwZyAlaW4lIGhlcml0YWJpbGl0eVtQIDwgMC4wNV0kcHJvYmUpCnN1bShmX2RtcnMkY3BnICVpbiUgaGVyaXRhYmlsaXR5W1AgPCAwLjA1XSRwcm9iZSkKCiMgcHJvcG9ydGlvbiBoZXJpdGFibGUgaW4gY2lzCnN1bShtX2RtcnMkY3BnICVpbiUgaGVyaXRhYmlsaXR5W1AgPCAwLjA1XSRwcm9iZSkgLyBucm93KG1fZG1ycykKc3VtKGZfZG1ycyRjcGcgJWluJSBoZXJpdGFiaWxpdHlbUCA8IDAuMDVdJHByb2JlKSAvIG5yb3coZl9kbXJzKQoKIyB0b3RhbCBwcm9wb3J0aW9uIGhlcml0YWJsZSBpbiBjaXMKbnJvdyhoZXJpdGFiaWxpdHlbUCA8IDAuMDVdKSAvIG5yb3coaGVyaXRhYmlsaXR5KQoKYGBgCkNoZWNraW5nIGlmIHRoZXNlIHByb3BvcnRpb25zIGFyZSBsYXJnZXIgdGhhbiBleHBlY3RlZCBhdCByYW5kb206CmBgYHtyfQojIFRlc3QgMSBpcyBwcm9wb3J0aW9uIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHRoYW4gcHJvcG9ydGlvbiBvZiBoZXJpdGFibGUgQ3BHcwpwcm9wLnRlc3QoYyg3MiwgNTMxNjUpLCBjKDQwNywgNzcyNTk5KSkKcHJvcC50ZXN0KGMoMTM1LCA1MzE2NSksIGMoOTYwLCA3NzI1OTkpKQpwcm9wLnRlc3QoYyg3MiwgMTM1KSwgYyg0MDcsIDk2MCkpCmxpYnJhcnkoc3RhdHMpCiMgVGVzdCAyIGlzIHByb3BvcnRpb24gZGlmZmVyZW50IHRoYW4gaWYgQ3BHcyB3ZXJlIHNlbGVjdGVkIGF0IHJhbmRvbQoxIC0gcGh5cGVyKDcyLCBzdW0oaGVyaXRhYmlsaXR5JFAgPCAwLjA1KSwgc3VtKGhlcml0YWJpbGl0eSRQID4gMC4wNSksIDQwNykKMSAtIHBoeXBlcigxMzUsIHN1bShoZXJpdGFiaWxpdHkkUCA8IDAuMDUpLCBzdW0oaGVyaXRhYmlsaXR5JFAgPiAwLjA1KSwgOTYwKQojIFBlcm11dGF0aW9uIHRlc3QKc3VtKHNhcHBseSgxOjEwMDAwLCBmdW5jdGlvbihpKSBzdW0oc2FtcGxlKGhlcml0YWJpbGl0eSRQIDwgMC4wNSwgNDA3KSkpID49IDcyKSAvIDEwMDAwCnN1bShzYXBwbHkoMToxMDAwMCwgZnVuY3Rpb24oaSkgc3VtKHNhbXBsZShoZXJpdGFiaWxpdHkkUCA8IDAuMDUsIDk2MCkpKSA+PSAxMzUpIC8gMTAwMDAKYGBgCgoKTGV0J3MgcGxvdCBvdXQgdGhlIGgyIHZhbHVlIGZvciB0aGVzZSAiaGVyaXRhYmxlIiBETVJzLCBhcyB3ZWxsIGFzIHRoZSBudW1iZXIgb2YgY2lzIFNOUHMgZm9yIHRoZXNlIERNUiBDcEdzOgpgYGB7cn0KaGVyaXRhYmlsaXR5X3NpZyA8LSBmcmVhZCgidGVycmVfaGVyaXRhYmlsaXR5XzE1MGtiX212YWx1ZV9zaWcudHh0IikKZ2dwbG90KGhlcml0YWJpbGl0eVttX2RtcnMkY3BnLCBvbiA9IC4ocHJvYmUpXVtQIDwgMC4wNV0sIGFlcyhoMikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMC4yLCAxLjApLCB5bGltID0gYygwLCAyMCkpCmdncGxvdChoZXJpdGFiaWxpdHlbZl9kbXJzJGNwZywgb24gPSAuKHByb2JlKV1bUCA8IDAuMDVdLCBhZXMoaDIpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAuMiwgMS4wKSwgeWxpbSA9IGMoMCwgMjApKQoKZ2dwbG90KGhlcml0YWJpbGl0eV9zaWdbbV9kbXJzJGNwZywgb24gPSAuKHByb2JlKV1bUCA8IDAuMDVdLCBhZXMobl9jaXNfc25wcykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgTkEpKQpnZ3Bsb3QoaGVyaXRhYmlsaXR5X3NpZ1tmX2RtcnMkY3BnLCBvbiA9IC4ocHJvYmUpXVtQIDwgMC4wNV0sIGFlcyhuX2Npc19zbnBzKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCBOQSkpCmBgYApgYGB7cn0KZl9oZXJpdGFibGUgPC0gZl9kbXJzW2NwZyAlY2hpbiUgaGVyaXRhYmlsaXR5W1AgPCAwLjA1XSRwcm9iZV1bb3JkZXIoLW1pbnB2YWx1ZSldCm1faGVyaXRhYmxlIDwtIG1fZG1yc1tjcGcgJWNoaW4lIGhlcml0YWJpbGl0eVtQIDwgMC4wNV0kcHJvYmVdW29yZGVyKC1taW5wdmFsdWUpXQptX2hlcml0YWJsZSRoMiA8LSBoZXJpdGFiaWxpdHlbbV9oZXJpdGFibGUkY3BnLCBvbiA9ICJwcm9iZSJdJGgyCmZfaGVyaXRhYmxlJGgyIDwtIGhlcml0YWJpbGl0eVtmX2hlcml0YWJsZSRjcGcsIG9uID0gInByb2JlIl0kaDIKCmZfaGVyaXRhYmxlW29yZGVyKC1oMiwgbWlucHZhbHVlKV0KbV9oZXJpdGFibGVbb3JkZXIoLWgyLCBtaW5wdmFsdWUpXQpgYGAKIyMgQW5hbHlzaXMgb2YgY2lzLW1RVExzIGF0IGVhY2ggRE1SCmBgYHtyfQpjaXNfbVFUTHMgPC0gZnJlYWQoIi4uL3Byc19ld2FzX2ludGVncmF0aW9uL2Npc19tUVRMX2FuYWx5c2VzL3RlcnJlX2RhdGEvY2lzX2FsbF9pbXB1dGVfbVFUTF9yZXN1bHRzX0NUUC50eHQuZ3oiKQptUVRMc19hdF9tZG1yIDwtIGNpc19tUVRMc1ttX2RtcnMkY3BnLCBvbiA9ICJnZW5lIl0KbVFUTHNfYXRfZmRtciA8LSBjaXNfbVFUTHNbZl9kbXJzJGNwZywgb24gPSAiZ2VuZSJdCmBgYApgYGB7cn0KY2lzX21RVExzW0ZEUiA8IDAuMDVdCmNpc19tUVRMc1tGRFIgPCAwLjA1ICYgIWR1cGxpY2F0ZWQoZ2VuZSldCmBgYAoKRGlnZ2luZyBpbnRvIHRoZXNlOgpgYGB7cn0KbWVyZ2UoZl9kbXJzLCBtUVRMc19hdF9mZG1yWywgLihtaW4oYHAtdmFsdWVgKSksIGJ5ID0gImdlbmUiXSwgYnkueCA9ICJjcGciLCBieS55ID0gImdlbmUiKQptZXJnZShtX2RtcnMsIG1RVExzX2F0X21kbXJbLCAuKG1pbihgcC12YWx1ZWApKSwgYnkgPSAiZ2VuZSJdLCBieS54ID0gImNwZyIsIGJ5LnkgPSAiZ2VuZSIpCmBgYAojIyBTZXgtc3RyYXRpZmllZCBtUVRMIGFuYWx5c2lzCmBgYHtyfQpjaXNfbVFUTHNfbSA8LSBmcmVhZCgiLi4vcHJzX2V3YXNfaW50ZWdyYXRpb24vY2lzX21RVExfYW5hbHlzZXMvdGVycmVfZGF0YS9tYWxlX2Npc19hbGxfaW1wdXRlX21RVExfcmVzdWx0c19DVFAudHh0Lmd6Iiwga2V5ID0gYygiU05QIiwgImdlbmUiKSkKbWFsZV9tUVRMc19hdF9tZG1yIDwtIGNpc19tUVRMc19tW21fZG1ycyRjcGcsIG9uID0gImdlbmUiXQpjaXNfbVFUTHNfZiA8LSBmcmVhZCgiLi4vcHJzX2V3YXNfaW50ZWdyYXRpb24vY2lzX21RVExfYW5hbHlzZXMvdGVycmVfZGF0YS9mZW1hbGVfY2lzX2FsbF9pbXB1dGVfbVFUTF9yZXN1bHRzX0NUUC50eHQuZ3oiLCBrZXkgPSBjKCJTTlAiLCAiZ2VuZSIpKQpmZW1hbGVfbVFUTHNfYXRfZmRtciA8LSBjaXNfbVFUTHNfZltmX2RtcnMkY3BnLCBvbiA9ICJnZW5lIl0KYGBgCmBgYHtyfQpoaXN0KGNpc19tUVRMc19mJGBwLXZhbHVlYCwgYnJlYWtzID0gMTAwLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBjaXMgbVFUTCBQIFZhbHVlcyBpbiBGZW1hbGVzIiwgeWxpbSA9IGMoMCwgMTBlNikpCmFibGluZShoID0gbnJvdyhjaXNfbVFUTHNfZikgLyAxMDApCgpoaXN0KGNpc19tUVRMc19tJGBwLXZhbHVlYCwgYnJlYWtzID0gMTAwLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBjaXMgbVFUTCBQIFZhbHVlcyBpbiBNYWxlcyIsIHlsaW0gPSBjKDAsIDEwZTYpKQphYmxpbmUoaCA9IG5yb3coY2lzX21RVExzX20pIC8gMTAwKQpgYGAKCmBgYHtyfQptYWxlX21RVExzX2F0X21kbXJbLCAiUCIgOj0gbWluKGBwLXZhbHVlYCksIGJ5ID0gImdlbmUiXQpmZW1hbGVfbVFUTHNfYXRfZmRtclssICJQIiA6PSBtaW4oYHAtdmFsdWVgKSwgYnkgPSAiZ2VuZSJdCm1hbGVfbVFUTHNfYXRfbWRtcgpmZW1hbGVfbVFUTHNfYXRfZmRtcgpoaXN0KG1hbGVfbVFUTHNfYXRfbWRtclshZHVwbGljYXRlZChnZW5lKV0kUCkKaGlzdChmZW1hbGVfbVFUTHNfYXRfZmRtclshZHVwbGljYXRlZChnZW5lKV0kUCkKCmhpc3QobWFsZV9tUVRMc19hdF9tZG1yJGBwLXZhbHVlYCwgYnJlYWtzID0gMTAwLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBjaXMtbVFUTCBQIFZhbHVlcyBhdCBNYWxlIERNUnMiLCB5bGltID0gYygwLCA1MDAwMCkpCmFibGluZShoID0gbnJvdyhtYWxlX21RVExzX2F0X21kbXIpIC8gMTAwKQoKaGlzdChmZW1hbGVfbVFUTHNfYXRfZmRtciRgcC12YWx1ZWAsIGJyZWFrcyA9IDEwMCwgbWFpbiA9ICJEaXN0cmlidXRpb24gb2YgY2lzLW1RVEwgUCBWYWx1ZXMgYXQgRmVtYWxlIERNUnMiKQphYmxpbmUoaCA9IG5yb3coZmVtYWxlX21RVExzX2F0X2ZkbXIpIC8gMTAwKQoKCiMgaGVyaXRhYmlsaXR5W1AgPCAwLjA1XVttX2RtcnMkY3BnW21fZG1ycyRjcGcgJWluJSBmX2RtcnMkY3BnXSxvbj0icHJvYmUiXQpsaWJyYXJ5KHFxbWFuKQpsaWJyYXJ5KHF2YWx1ZSkKcXEobWFsZV9tUVRMc19hdF9tZG1yJGBwLXZhbHVlYCkKcXEoZmVtYWxlX21RVExzX2F0X2ZkbXIkYHAtdmFsdWVgKQptX21hdGNoZWRfc3RhdCA8LSBjaXNfbVFUTHNfbVtjaXNfbVFUTHNfZltGRFIgPCAwLjA1XVssIC4oU05QLCBnZW5lKV0sIG9uID0gYygiU05QIiwgImdlbmUiKV0KZl9tYXRjaGVkX3N0YXQgPC0gY2lzX21RVExzX2ZbY2lzX21RVExzX21bRkRSIDwgMC4wNV1bLCAuKFNOUCwgZ2VuZSldLCBvbiA9IGMoIlNOUCIsICJnZW5lIildCmBgYAoKCgojIyBBSUMgdmFsdWVzIGZvciBzZXgtc3RyYXRpZmllZCBHIG1vZGVscwpgYGB7cn0KKG1hbGVfZ19haWMgPC0gZnJlYWQoIm1hbGVfZG5hbV9icmVha2Rvd24udHh0Iilbb3JkZXIoYWljKV0pCihmZW1hbGVfZ19haWMgPC0gZnJlYWQoImZlbWFsZV9kbmFtX2JyZWFrZG93bi50eHQiKVtvcmRlcihhaWMpXSkKbV9taW5fYWljIDwtIG1hbGVfZ19haWNbLCAuKGFpYyA9IG1pbihhaWMpLCBzZXggPSAibWFsZSIpLCBieSA9ICJjcGciXQpmX21pbl9haWMgPC0gZmVtYWxlX2dfYWljWywgLihhaWMgPSBtaW4oYWljKSwgc2V4ID0gImZlbWFsZSIpLCBieSA9ICJjcGciXQpnZ3Bsb3QocmJpbmQobV9taW5fYWljLCBmX21pbl9haWMpLCBhZXMoYWljLCBmaWxsID0gc2V4KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDAsIGFscGhhID0gLjkpICsKICBnZ3RpdGxlKCJNaW5pbXVtIEctbW9kZWwgQUlDIFZhbHVlIHBlciBETVIgcGVyIFNleCIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgojIyBBSUMgdmFsdWVzIGZvciB0b3AgNSByZXByZXNlbnRlZCBFICsgUGVzdGljaWRlcyBvZiBJbnRlcmVzdApgYGB7cn0KbWFsZV9hbGxfYWljIDwtIHVuaXF1ZShyYmluZGxpc3QobGFwcGx5KGZzOjpkaXJfbHMoZ2xvYiA9ICJtYWxlKmJyZWFrZG93bi50eHQuZ3oiKSwgZnJlYWQpLCBmaWxsID0gVFJVRSkpCmZlbWFsZV9hbGxfYWljIDwtIHVuaXF1ZShyYmluZGxpc3QobGFwcGx5KGZzOjpkaXJfbHMoZ2xvYiA9ICJmZW1hbGUqYnJlYWtkb3duLnR4dC5neiIpLCBmcmVhZCksIGZpbGwgPSBUUlVFKSkKYGBgCiMjIyBSYW5raW5nIG1vZGVscwpgYGB7cn0KZmVtYWxlX2Rtcl9jcGdzIDwtIGZyZWFkKCJ+L0FJQ19GLmNzdiIpCm1hbGVfZG1yX2NwZ3MgPC0gZnJlYWQoIn4vQUlDX00uY3N2IikKbWFsZV9taW5fYWljX21vZGVscyA8LSBtYWxlX2FsbF9haWNbLCAuU0Rbd2hpY2gubWluKGFpYyldLCBieSA9IGMoImNwZyIsICJtb2RlbCIpXVssIC5TRFt3aGljaC5taW4oYWljKV0sIGJ5ID0gImNwZyJdCmZlbWFsZV9taW5fYWljX21vZGVscyA8LSBmZW1hbGVfYWxsX2FpY1ssIC5TRFt3aGljaC5taW4oYWljKV0sIGJ5ID0gYygiY3BnIiwgIm1vZGVsIildWywgLlNEW3doaWNoLm1pbihhaWMpXSwgYnkgPSAiY3BnIl0KZmVtYWxlX21pbl9haWNfbW9kZWxzW29yZGVyKC1tb2RlbCldCmZlbWFsZV9taW5fYWljX21vZGVsc1tvcmRlcigtbW9kZWwpXQp1bmlxdWUoZmVtYWxlX21pbl9haWNfbW9kZWxzJGVudikKd3JpdGUuY3N2KGZlbWFsZV9taW5fYWljX21vZGVscyAlPiUgZmlsdGVyKGdyZXBsKCJFIiwgbW9kZWwpKSAlPiUgc2VsZWN0KGNwZywgU05QLCBtb2RlbCwgZW52LCBhaWMpLCBxdW90ZSA9IEYpCgp3cml0ZS5jc3YoZmVtYWxlX21pbl9haWNfbW9kZWxzICU+JSBmaWx0ZXIoZ3JlcGwoIkUiLCBtb2RlbCkpICU+JSBzZWxlY3QoY3BnLCBTTlAsIG1vZGVsLCBlbnYsIGFpYykgJT4lIGZpbHRlcihjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkQ3BHKSwgcXVvdGUgPSBGKQp3cml0ZS5jc3YobWFsZV9taW5fYWljX21vZGVscyAlPiUgZmlsdGVyKGdyZXBsKCJFIiwgbW9kZWwpKSAlPiUgc2VsZWN0KGNwZywgU05QLCBtb2RlbCwgZW52LCBhaWMpICU+JSBmaWx0ZXIoY3BnICVpbiUgbWFsZV9kbXJfY3BncyRDcEcpLCBxdW90ZSA9IEYpCndyaXRlLmNzdihmZW1hbGVfbWluX2FpY19tb2RlbHMgJT4lIHNlbGVjdChjcGcsIFNOUCwgbW9kZWwsIGVudiwgYWljKSAlPiUgZmlsdGVyKGNwZyAlaW4lIGZlbWFsZV9kbXJfY3BncyRDcEcpLCBxdW90ZSA9IEYpCndyaXRlLmNzdihtYWxlX21pbl9haWNfbW9kZWxzICU+JSBzZWxlY3QoY3BnLCBTTlAsIG1vZGVsLCBlbnYsIGFpYykgJT4lIGZpbHRlcihjcGcgJWluJSBtYWxlX2Rtcl9jcGdzJENwRyksIHF1b3RlID0gRikKYGBgCgoKYGBge3J9CmdncGxvdChtYWxlX21pbl9haWNfbW9kZWxzICU+JSBmaWx0ZXIoY3BnICVpbiUgbWFsZV9kbXJfY3BncyRDcEcpLCBhZXMobW9kZWwpKSArCiAgZ2VvbV9iYXIoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHN0YXQgPSAiY291bnQiLCB2anVzdCA9IC0wLjUpCmdncGxvdChmZW1hbGVfbWluX2FpY19tb2RlbHMgJT4lIGZpbHRlcihjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkQ3BHKSwgYWVzKG1vZGVsKSkgKwogIGdlb21fYmFyKCkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSAuLmNvdW50Li4pLCBzdGF0ID0gImNvdW50Iiwgdmp1c3QgPSAtMC41KSArCiAgZ2d0aXRsZSgiRmVtYWxlIERNUiBtb2RlbHMgKHJlcHJlc2VudGF0aXZlIENwR3MpIikKYGBgCiMjIyBSYW5nZXMgb2YgQUlDIHZhbHVlcyBhY3Jvc3MgbW9kZWxzCmBgYHtyfQpib3RoX3NleF9haWMgPC0gYmluZF9yb3dzKGxpc3QobWFsZSA9IG1hbGVfYWxsX2FpYyAlPiUgZmlsdGVyKGNwZyAlaW4lIG1hbGVfZG1yX2NwZ3MkQ3BHKSwgZmVtYWxlID0gZmVtYWxlX2FsbF9haWMgJT4lIGZpbHRlcihjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkQ3BHKSksIC5pZCA9ICJTZXgiKQpnZ3Bsb3QoYm90aF9zZXhfYWljLCBhZXMoYWljLCBmaWxsID0gU2V4KSkgKwogIGdlb21faGlzdG9ncmFtKCkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobW9kZWwpLCBzY2FsZXMgPSAiZnJlZV95IikKYGBgCgpgYGB7cn0KbWFsZV9hbGxfYWljW21vZGVsID09ICJFIl0KYGBgCiMjIyBNb2RlbHMgYWNjb3VudGluZyBmb3IgUEQKLSBTdGVwIDE6IHJlYWQgaW4gZGF0YSwgcnVuIG11bHRpcGxlIHRlc3QgY29ycmVjdGlvbgotIHN0ZXAgMjogcmVtb3ZlIHRob3NlIHdoaWNoIGRvbid0IHBhc3MgYSBzaWduaWZpY2FuY2UgdGhyZXNob2xkCi0gc3RlcCAzOiByYW5rIGJ5IEFJQwpMb2FkaW5nIGluIGFsbCBleHBlcmltZW50cwpgYGB7cn0KbWFsZXNfcGQgPC0gcmJpbmRsaXN0KGxhcHBseShTeXMuZ2xvYigibWFsZV90ZXJyZV9wZF9mXypfZG5hbV9icmVha2Rvd24udHh0Lmd6IiksIGZ1bmN0aW9uKGYpIGZyZWFkKGYsIGZpbGwgPSBUUlVFKSksIGZpbGwgPSBUUlVFKQptYWxlc19wZFssIGMoImZfcSIpIDo9IGMocC5hZGp1c3QoZl9wLCBtZXRob2QgPSAiQkgiKSksIGJ5ID0gYygibW9kZWwiLCAiZW52IildCmZlbWFsZXNfcGQgPC0gcmJpbmRsaXN0KGxhcHBseShTeXMuZ2xvYigiZmVtYWxlX3RlcnJlX3BkX2ZfKl9kbmFtX2JyZWFrZG93bi50eHQuZ3oiKSwgZnVuY3Rpb24oZikgZnJlYWQoZiwgZmlsbCA9IFRSVUUpKSwgZmlsbCA9IFRSVUUpCmZlbWFsZXNfcGRbLCBjKCJmX3EiKSA6PSBjKHAuYWRqdXN0KGZfcCwgbWV0aG9kID0gIkJIIikpLCBieSA9IGMoIm1vZGVsIiwgImVudiIpXQpgYGAKCiMjIyMgRXhjbHVkZSBtb2RlbHMgYmFzZWQgb24gRiB0ZXN0IGFuZCBkZWx0YSBiZXRhIGN1dG9mZiB2cyBiYXNlbGluZQpgYGB7cn0KKG1pbl9mX2ZlbWFsZXNfcGQgPC0gZmVtYWxlc19wZFtvcmRlcihjcGcpLCAuU0Rbd2hpY2gubWluKGFpYyldLCBieSA9IGMoImNwZyIsICJtb2RlbCIpXVtmX3EgPCAwLjA1XSkKKG1pbl9mX21hbGVzX3BkIDwtIG1hbGVzX3BkW29yZGVyKGNwZyksIC5TRFt3aGljaC5taW4oYWljKV0sIGJ5ID0gYygiY3BnIiwgIm1vZGVsIildW2ZfcSA8IDAuMDVdKQpgYGAKYGBge3J9CmdncGxvdChtaW5fZl9mZW1hbGVzX3BkWywgLlNEW3doaWNoLm1pbihmX3ApXSwgYnkgPSAiY3BnIl0sIGFlcyhtb2RlbCkpICsKICBnZW9tX2JhcigpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gLi5jb3VudC4uKSwgc3RhdCA9ICJjb3VudCIsIHZqdXN0ID0gMCkgKwogIGdndGl0bGUoIkZlbWFsZSBNb2RlbHMgcmFua2VkIGJ5IFAoRikgYWNjb3VudGluZyBmb3JcblBEIHN0YXR1cyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCkpCmdncGxvdChtaW5fZl9tYWxlc19wZFssIC5TRFt3aGljaC5taW4oZl9wKV0sIGJ5ID0gImNwZyJdLCBhZXMobW9kZWwpKSArCiAgZ2VvbV9iYXIoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHN0YXQgPSAiY291bnQiLCB2anVzdCA9IDApICsKICBnZ3RpdGxlKCJNYWxlIE1vZGVscyByYW5rZWQgYnkgUChGKSBhY2NvdW50aW5nIGZvclxuUEQgc3RhdHVzIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkKZ2dwbG90KG1pbl9mX2ZlbWFsZXNfcGQsIGFlcyhtb2RlbCkpICsKICBnZW9tX2JhcigpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gLi5jb3VudC4uKSwgc3RhdCA9ICJjb3VudCIsIHZqdXN0ID0gMCkgKwogIGdndGl0bGUoIlNpZ25pZmljYW50IEZlbWFsZSBNb2RlbHMgYWNjb3VudGluZyBmb3JcblBEIHN0YXR1cyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCkpCmdncGxvdChtaW5fZl9tYWxlc19wZCwgYWVzKG1vZGVsKSkgKwogIGdlb21fYmFyKCkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSAuLmNvdW50Li4pLCBzdGF0ID0gImNvdW50Iiwgdmp1c3QgPSAwKSArCiAgZ2d0aXRsZSgiU2lnbmlmaWNhbnQgTWFsZSBNb2RlbHMgYWNjb3VudGluZyBmb3JcblBEIHN0YXR1cyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCkpCmBgYAoKYGBge3J9CihtaW5fYWljX2ZlbWFsZXNfcGQgPC0gZmVtYWxlc19wZFtvcmRlcihjcGcpLCAuU0Rbd2hpY2gubWluKGFpYyldLCBieSA9ICJjcGciXSkKKG1pbl9haWNfbWFsZXNfcGQgPC0gbWFsZXNfcGRbb3JkZXIoY3BnKSwgLlNEW3doaWNoLm1pbihhaWMpXSwgYnkgPSAiY3BnIl0pCmBgYAoKYGBge3J9CnAxIDwtIGdncGxvdChtaW5fYWljX2ZlbWFsZXNfcGQgJT4lIG11dGF0ZShzaWdfZiA9IGZhY3RvcihmX3EgPCAwLjA1LCBsZXZlbHMgPSBjKFRSVUUsIEZBTFNFKSkpLCBhZXMobW9kZWwsIGZpbGwgPSBzaWdfZikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gLi5jb3VudC4uKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCBzdGF0ID0gImNvdW50Iiwgdmp1c3QgPSAwKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwMDApKSArCiAgbGFicyhmaWxsID0gIkZEUiA8IDAuMDUiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJsaWdodHBpbmsyIiwgImxpZ2h0cGluazQiKSkKCnAyIDwtIGdncGxvdChtaW5fYWljX21hbGVzX3BkICU+JSBtdXRhdGUoc2lnX2YgPSBmYWN0b3IoZl9xIDwgMC4wNSwgbGV2ZWxzID0gYyhUUlVFLCBGQUxTRSkpKSwgYWVzKG1vZGVsLCBmaWxsID0gc2lnX2YpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc3RhdCA9ICJjb3VudCIsIHZqdXN0ID0gMCkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkgKwogIGxhYnMoZmlsbCA9ICJGRFIgPCAwLjA1IikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIpKQoKCgoKcDMgPC0gZ2dwbG90KG1pbl9haWNfZmVtYWxlc19wZCAlPiUgbXV0YXRlKHNpZ19mID0gZmFjdG9yKGZfcSA8IDAuMDUsIGxldmVscyA9IGMoVFJVRSwgRkFMU0UpKSkgJT4lIGZpbHRlcihjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkQ3BHKSwgYWVzKG1vZGVsLCBmaWxsID0gc2lnX2YpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc3RhdCA9ICJjb3VudCIsIHZqdXN0ID0gMCkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MCkpICsKICBsYWJzKGZpbGwgPSAiRkRSIDwgMC4wNSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0cGluazIiLCAibGlnaHRwaW5rNCIpKQoKcDQgPC0gZ2dwbG90KG1pbl9haWNfbWFsZXNfcGQgJT4lIG11dGF0ZShzaWdfZiA9IGZhY3RvcihmX3EgPCAwLjA1LCBsZXZlbHMgPSBjKFRSVUUsIEZBTFNFKSkpICU+JSBmaWx0ZXIoY3BnICVpbiUgbWFsZV9kbXJfY3BncyRDcEcpLCBhZXMobW9kZWwsIGZpbGwgPSBzaWdfZikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gLi5jb3VudC4uKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCBzdGF0ID0gImNvdW50Iiwgdmp1c3QgPSAwKSArCiAgbGFicyhmaWxsID0gIkZEUiA8IDAuMDUiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTApKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIpKQpjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIG5yb3cgPSAyLCBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3J9Cm1pbl9haWNfZmVtYWxlc19wZCAlPiUKICBmaWx0ZXIoZl9xIDwgMC4wNSwgY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJENwRywgbW9kZWwgPT0gIkd4RSIpICU+JQogIHdyaXRlLmNzdigpCmBgYAoKIyMjIyBOZXN0ZWQgbW9kZWxzCgpgYGB7cn0KZmVtYWxlX25lc3RlZCA8LSBmcmVhZCgiZmVtYWxlX3RlcnJlX3BkX2ZuZXN0ZWRfZG5hbV9icmVha2Rvd24udHh0Lmd6IikKZmVtYWxlX25lc3RlZFssIGA6PWAoCiAgZl9xX2d4ZSA9IHAuYWRqdXN0KGZfcF9neGUsIG1ldGhvZCA9ICJCSCIpLAogIGZfcV9nZWUgPSBwLmFkanVzdChmX3BfZ2VlLCBtZXRob2QgPSAiQkgiKSwKICBmX3FfZ2VnID0gcC5hZGp1c3QoZl9wX2dlZywgbWV0aG9kID0gIkJIIiksCiAgZl9xX2cgPSBwLmFkanVzdChmX3BfZywgbWV0aG9kID0gIkJIIiksCiAgZl9xX2UgPSBwLmFkanVzdChmX3BfZSwgbWV0aG9kID0gIkJIIikKKSwKYnkgPSAiZW52IgpdCm1hbGVfbmVzdGVkIDwtIGZyZWFkKCJtYWxlX3RlcnJlX3BkX2ZuZXN0ZWRfZG5hbV9icmVha2Rvd24udHh0Lmd6IikKbWFsZV9uZXN0ZWRbLCBgOj1gKAogIGZfcV9neGUgPSBwLmFkanVzdChmX3BfZ3hlLCBtZXRob2QgPSAiQkgiKSwKICBmX3FfZ2VlID0gcC5hZGp1c3QoZl9wX2dlZSwgbWV0aG9kID0gIkJIIiksCiAgZl9xX2dlZyA9IHAuYWRqdXN0KGZfcF9nZWcsIG1ldGhvZCA9ICJCSCIpLAogIGZfcV9nID0gcC5hZGp1c3QoZl9wX2csIG1ldGhvZCA9ICJCSCIpLAogIGZfcV9lID0gcC5hZGp1c3QoZl9wX2UsIG1ldGhvZCA9ICJCSCIpCiksCmJ5ID0gImVudiIKXQpgYGAKCgpgYGB7cn0KKGZfZ3hlX2NvdW50IDwtIGZlbWFsZV9uZXN0ZWRbZl9xX2d4ZSA8IDAuMDUgJiAoZl9xX2dlZSA8IDAuMDUgfCBmX3FfZ2VnIDwgMC4wNSkgJiAoZl9xX2cgPCAwLjA1IHwgZl9xX2UgPCAwLjA1KV1bLCAuKHNucHMgPSBsZW5ndGgodW5pcXVlKHNucCkpLCBlbnZzID0gcGFzdGUwKHVuaXF1ZShlbnYpLCBjb2xsYXBzZSA9ICIsIikpLCBieSA9ICJjcGciXSkKKG1fZ3hlX2NvdW50IDwtIG1hbGVfbmVzdGVkW2ZfcV9neGUgPCAwLjA1ICYgKGZfcV9nZWUgPCAwLjA1IHwgZl9xX2dlZyA8IDAuMDUpICYgKGZfcV9nIDwgMC4wNSB8IGZfcV9lIDwgMC4wNSldWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl0pCgooZl9nZV9jb3VudCA8LSBmZW1hbGVfbmVzdGVkW2ZfcV9neGUgPiAwLjA1ICYgKGZfcV9nZWUgPCAwLjA1IHwgZl9xX2dlZyA8IDAuMDUpICYgKGZfcV9nIDwgMC4wNSB8IGZfcV9lIDwgMC4wNSldWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl0pCihtX2dlX2NvdW50IDwtIG1hbGVfbmVzdGVkW2ZfcV9neGUgPiAwLjA1ICYgKGZfcV9nZWUgPCAwLjA1IHwgZl9xX2dlZyA8IDAuMDUpICYgKGZfcV9nIDwgMC4wNSB8IGZfcV9lIDwgMC4wNSldWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl0pCgooZl9nX2NvdW50IDwtIGZlbWFsZV9uZXN0ZWRbZl9xX2d4ZSA+IDAuMDUgJiBmX3FfZ2VlID4gMC4wNSAmIGZfcV9nZWcgPiAwLjA1ICYgZl9xX2cgPCAwLjA1ICYgZl9xX2UgPiAwLjA1XVssIC4oc25wcyA9IGxlbmd0aCh1bmlxdWUoc25wKSksIGVudnMgPSBwYXN0ZTAodW5pcXVlKGVudiksIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gImNwZyJdKQoobV9nX2NvdW50IDwtIG1hbGVfbmVzdGVkW2ZfcV9neGUgPiAwLjA1ICYgZl9xX2dlZSA+IDAuMDUgJiBmX3FfZ2VnID4gMC4wNSAmIGZfcV9nIDwgMC4wNSAmIGZfcV9lID4gMC4wNV1bLCAuKHNucHMgPSBsZW5ndGgodW5pcXVlKHNucCkpLCBlbnZzID0gcGFzdGUwKHVuaXF1ZShlbnYpLCBjb2xsYXBzZSA9ICIsIikpLCBieSA9ICJjcGciXSkKCihmX2VfY291bnQgPC0gZmVtYWxlX25lc3RlZFtmX3FfZ3hlID4gMC4wNSAmIGZfcV9nZWUgPiAwLjA1ICYgZl9xX2dlZyA+IDAuMDUgJiBmX3FfZyA+IDAuMDUgJiBmX3FfZSA8IDAuMDVdWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl0pCihtX2VfY291bnQgPC0gbWFsZV9uZXN0ZWRbZl9xX2d4ZSA+IDAuMDUgJiBmX3FfZ2VlID4gMC4wNSAmIGZfcV9nZWcgPiAwLjA1ICYgZl9xX2cgPiAwLjA1ICYgZl9xX2UgPCAwLjA1XVssIC4oc25wcyA9IGxlbmd0aCh1bmlxdWUoc25wKSksIGVudnMgPSBwYXN0ZTAodW5pcXVlKGVudiksIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gImNwZyJdKQpgYGAKUmVzdHJpY3RpbmcgdG8ganVzdCB0aG9zZSBETVJzIHdoaWNoIHBhc3MgYSBzdHJpY3RlciBjdXRvZmY6CmBgYHtyfQooc2lnX2ZfZ3hlX2NvdW50IDwtIGZlbWFsZV9uZXN0ZWRbZl9xX2d4ZSA8IDAuMDUgJiAoZl9xX2dlZSA8IDAuMDUgfCBmX3FfZ2VnIDwgMC4wNSkgJiAoZl9xX2cgPCAwLjA1IHwgZl9xX2UgPCAwLjA1KV1bLCAuKHNucHMgPSBsZW5ndGgodW5pcXVlKHNucCkpLCBlbnZzID0gcGFzdGUwKHVuaXF1ZShlbnYpLCBjb2xsYXBzZSA9ICIsIikpLCBieSA9ICJjcGciXVtjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkVjFdKQooc2lnX21fZ3hlX2NvdW50IDwtIG1hbGVfbmVzdGVkW2ZfcV9neGUgPCAwLjA1ICYgKGZfcV9nZWUgPCAwLjA1IHwgZl9xX2dlZyA8IDAuMDUpICYgKGZfcV9nIDwgMC4wNSB8IGZfcV9lIDwgMC4wNSldWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl1bY3BnICVpbiUgbWFsZV9kbXJfY3BncyRWMV0pCgooc2lnX2ZfZ2VfY291bnQgPC0gZmVtYWxlX25lc3RlZFtmX3FfZ3hlID4gMC4wNSAmIChmX3FfZ2VlIDwgMC4wNSB8IGZfcV9nZWcgPCAwLjA1KSAmIChmX3FfZyA8IDAuMDUgfCBmX3FfZSA8IDAuMDUpXVssIC4oc25wcyA9IGxlbmd0aCh1bmlxdWUoc25wKSksIGVudnMgPSBwYXN0ZTAodW5pcXVlKGVudiksIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gImNwZyJdW2NwZyAlaW4lIGZlbWFsZV9kbXJfY3BncyRWMV0pCihzaWdfbV9nZV9jb3VudCA8LSBtYWxlX25lc3RlZFtmX3FfZ3hlID4gMC4wNSAmIChmX3FfZ2VlIDwgMC4wNSB8IGZfcV9nZWcgPCAwLjA1KSAmIChmX3FfZyA8IDAuMDUgfCBmX3FfZSA8IDAuMDUpXVssIC4oc25wcyA9IGxlbmd0aCh1bmlxdWUoc25wKSksIGVudnMgPSBwYXN0ZTAodW5pcXVlKGVudiksIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gImNwZyJdW2NwZyAlaW4lIG1hbGVfZG1yX2NwZ3MkVjFdKQoKKHNpZ19mX2dfY291bnQgPC0gZmVtYWxlX25lc3RlZFtmX3FfZ3hlID4gMC4wNSAmIGZfcV9nZWUgPiAwLjA1ICYgZl9xX2dlZyA+IDAuMDUgJiBmX3FfZyA8IDAuMDUgJiBmX3FfZSA+IDAuMDVdWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl1bY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJFYxXSkKKHNpZ19tX2dfY291bnQgPC0gbWFsZV9uZXN0ZWRbZl9xX2d4ZSA+IDAuMDUgJiBmX3FfZ2VlID4gMC4wNSAmIGZfcV9nZWcgPiAwLjA1ICYgZl9xX2cgPCAwLjA1ICYgZl9xX2UgPiAwLjA1XVssIC4oc25wcyA9IGxlbmd0aCh1bmlxdWUoc25wKSksIGVudnMgPSBwYXN0ZTAodW5pcXVlKGVudiksIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gImNwZyJdW2NwZyAlaW4lIG1hbGVfZG1yX2NwZ3MkVjFdKQoKKHNpZ19mX2VfY291bnQgPC0gZmVtYWxlX25lc3RlZFtmX3FfZ3hlID4gMC4wNSAmIGZfcV9nZWUgPiAwLjA1ICYgZl9xX2dlZyA+IDAuMDUgJiBmX3FfZyA+IDAuMDUgJiBmX3FfZSA8IDAuMDVdWywgLihzbnBzID0gbGVuZ3RoKHVuaXF1ZShzbnApKSwgZW52cyA9IHBhc3RlMCh1bmlxdWUoZW52KSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAiY3BnIl1bY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJFYxXSkKKHNpZ19tX2VfY291bnQgPC0gbWFsZV9uZXN0ZWRbZl9xX2d4ZSA+IDAuMDUgJiBmX3FfZ2VlID4gMC4wNSAmIGZfcV9nZWcgPiAwLjA1ICYgZl9xX2cgPiAwLjA1ICYgZl9xX2UgPCAwLjA1XVssIC4oc25wcyA9IGxlbmd0aCh1bmlxdWUoc25wKSksIGVudnMgPSBwYXN0ZTAodW5pcXVlKGVudiksIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gImNwZyJdW2NwZyAlaW4lIG1hbGVfZG1yX2NwZ3MkVjFdKQpgYGAKIyMjIyMgUGxvdHRpbmcgY291bnRzIGZyb20gcHJldmlvdXMgU2VjdGlvbgpgYGB7cn0KZl9uZXN0ZWRfY291bnQgPC0gZGF0YS50YWJsZSgKICBjb3VudCA9IGMobnJvdyhmX2d4ZV9jb3VudCksIG5yb3coZl9nZV9jb3VudCksIG5yb3coZl9nX2NvdW50KSwgbnJvdyhmX2VfY291bnQpKSwKICBNb2RlbCA9IGMoIkd4RSIsICJHK0UiLCAiRyIsICJFIikKKQoKbV9uZXN0ZWRfY291bnQgPC0gZGF0YS50YWJsZSgKICBjb3VudCA9IGMobnJvdyhtX2d4ZV9jb3VudCksIG5yb3cobV9nZV9jb3VudCksIG5yb3cobV9nX2NvdW50KSwgbnJvdyhtX2VfY291bnQpKSwKICBNb2RlbCA9IGMoIkd4RSIsICJHK0UiLCAiRyIsICJFIikKKQpzaWdfZl9uZXN0ZWRfY291bnQgPC0gZGF0YS50YWJsZSgKICBjb3VudCA9IGMobnJvdyhzaWdfZl9neGVfY291bnQpLCBucm93KHNpZ19mX2dlX2NvdW50KSwgbnJvdyhzaWdfZl9nX2NvdW50KSwgbnJvdyhzaWdfZl9lX2NvdW50KSksCiAgTW9kZWwgPSBjKCJHeEUiLCAiRytFIiwgIkciLCAiRSIpCikKCnNpZ19tX25lc3RlZF9jb3VudCA8LSBkYXRhLnRhYmxlKAogIGNvdW50ID0gYyhucm93KHNpZ19tX2d4ZV9jb3VudCksIG5yb3coc2lnX21fZ2VfY291bnQpLCBucm93KHNpZ19tX2dfY291bnQpLCBucm93KHNpZ19tX2VfY291bnQpKSwKICBNb2RlbCA9IGMoIkd4RSIsICJHK0UiLCAiRyIsICJFIikKKQoKCmdncGxvdChmX25lc3RlZF9jb3VudCwgYWVzKE1vZGVsLCBjb3VudCwgbGFiZWwgPSBjb3VudCkpICsKICBnZW9tX2NvbCgpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCB2anVzdCA9IDApCmdncGxvdChtX25lc3RlZF9jb3VudCwgYWVzKE1vZGVsLCBjb3VudCwgbGFiZWwgPSBjb3VudCkpICsKICBnZW9tX2NvbCgpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCB2anVzdCA9IDApCmdncGxvdChzaWdfZl9uZXN0ZWRfY291bnQsIGFlcyhNb2RlbCwgY291bnQsIGxhYmVsID0gY291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgdmp1c3QgPSAwKQpnZ3Bsb3Qoc2lnX21fbmVzdGVkX2NvdW50LCBhZXMoTW9kZWwsIGNvdW50LCBsYWJlbCA9IGNvdW50KSkgKwogIGdlb21fY29sKCkgKwogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSksIHZqdXN0ID0gMCkKYGBgCgojIyMjIyBBSUMgbW9kZWxzIHRoYXQgbWF0Y2ggd2l0aCBuZXN0ZWQgZGVmaW5pdGlvbgpgYGB7cn0KbV9neGVfY291bnQkbW9kZWwgPC0gIkd4RSIKbV9nZV9jb3VudCRtb2RlbCA8LSAiRytFIgptX2dfY291bnQkbW9kZWwgPC0gIkciCm1fZV9jb3VudCRtb2RlbCA8LSAiRSIKCmZfZ3hlX2NvdW50JG1vZGVsIDwtICJHeEUiCmZfZ2VfY291bnQkbW9kZWwgPC0gIkcrRSIKZl9nX2NvdW50JG1vZGVsIDwtICJHIgpmX2VfY291bnQkbW9kZWwgPC0gIkUiCgptX2FpY19mbmVzdGVkIDwtIG1lcmdlKG1pbl9haWNfbWFsZXNfcGQsIHJiaW5kKG1fZ3hlX2NvdW50LCBtX2dlX2NvdW50LCBtX2dfY291bnQsIG1fZV9jb3VudCksIGJ5ID0gYygiY3BnIiwgIm1vZGVsIikpCmZfYWljX2ZuZXN0ZWQgPC0gbWVyZ2UobWluX2FpY19mZW1hbGVzX3BkLCByYmluZChmX2d4ZV9jb3VudCwgZl9nZV9jb3VudCwgZl9nX2NvdW50LCBmX2VfY291bnQpLCBieSA9IGMoImNwZyIsICJtb2RlbCIpKQoKCmdncGxvdChmX2FpY19mbmVzdGVkLCBhZXMobW9kZWwpKSArCiAgZ2VvbV9iYXIoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc3RhdCA9ICJjb3VudCIsIHZqdXN0ID0gMCkKZ2dwbG90KG1fYWljX2ZuZXN0ZWQsIGFlcyhtb2RlbCkpICsKICBnZW9tX2JhcigpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gLi5jb3VudC4uKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCBzdGF0ID0gImNvdW50Iiwgdmp1c3QgPSAwKQoKZ2dwbG90KGZfYWljX2ZuZXN0ZWRbY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJFYxXSwgYWVzKG1vZGVsKSkgKwogIGdlb21fYmFyKCkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSAuLmNvdW50Li4pLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSksIHN0YXQgPSAiY291bnQiLCB2anVzdCA9IDApCmdncGxvdChtX2FpY19mbmVzdGVkW2NwZyAlaW4lIG1hbGVfZG1yX2NwZ3MkVjFdLCBhZXMobW9kZWwpKSArCiAgZ2VvbV9iYXIoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc3RhdCA9ICJjb3VudCIsIHZqdXN0ID0gMCkKYGBgCiMjIyMjIEdlbmUgYW5hbHlzaXMKYGBge3J9CmFubm90YXRpb24gPC0gZnJlYWQoIn4vTWV0aHlsYXRpb25FUElDX3YtMS0wX0I0LmNzdiIsIHNraXAgPSA3LCBmaWxsID0gVFJVRSkKCmZfbmVzdGVkX2Fubm90IDwtIG1lcmdlKGFubm90YXRpb24sIHJiaW5kKGZfZ3hlX2NvdW50LCBmX2dlX2NvdW50LCBmX2dfY291bnQsIGZfZV9jb3VudCksIGJ5LnggPSAiTmFtZSIsIGJ5LnkgPSAiY3BnIikKbV9uZXN0ZWRfYW5ub3QgPC0gbWVyZ2UoYW5ub3RhdGlvbiwgcmJpbmQobV9neGVfY291bnQsIG1fZ2VfY291bnQsIG1fZ19jb3VudCwgbV9lX2NvdW50KSwgYnkueCA9ICJOYW1lIiwgYnkueSA9ICJjcGciKQoKdW5pcXVlKGZfbmVzdGVkX2Fubm90LCBieSA9ICJVQ1NDX1JlZkdlbmVfTmFtZSIpW21vZGVsID09ICJHeEUiXQp1bmlxdWUobV9uZXN0ZWRfYW5ub3QsIGJ5ID0gIlVDU0NfUmVmR2VuZV9OYW1lIilbbW9kZWwgPT0gIkd4RSJdCgp1bmlxdWUoZl9uZXN0ZWRfYW5ub3QsIGJ5ID0gIlVDU0NfUmVmR2VuZV9OYW1lIilbbW9kZWwgPT0gIkUiXQp1bmlxdWUobV9uZXN0ZWRfYW5ub3QsIGJ5ID0gIlVDU0NfUmVmR2VuZV9OYW1lIilbbW9kZWwgPT0gIkUiXQoKdW5pcXVlKGZfbmVzdGVkX2Fubm90LCBieSA9ICJVQ1NDX1JlZkdlbmVfTmFtZSIpW05hbWUgJWluJSBmZW1hbGVfZG1yX2NwZ3MkVjEgJiBtb2RlbCA9PSAiRytFIl0KdW5pcXVlKG1fbmVzdGVkX2Fubm90LCBieSA9ICJVQ1NDX1JlZkdlbmVfTmFtZSIpW05hbWUgJWluJSBtYWxlX2Rtcl9jcGdzJFYxICYgbW9kZWwgPT0gIkcrRSJdCgp1bmlxdWUoZl9uZXN0ZWRfYW5ub3QsIGJ5ID0gIlVDU0NfUmVmR2VuZV9OYW1lIilbTmFtZSAlaW4lIGZlbWFsZV9kbXJfY3BncyRWMSAmIG1vZGVsID09ICJHIl0KdW5pcXVlKG1fbmVzdGVkX2Fubm90LCBieSA9ICJVQ1NDX1JlZkdlbmVfTmFtZSIpW05hbWUgJWluJSBtYWxlX2Rtcl9jcGdzJFYxICYgbW9kZWwgPT0gIkciXQoKbWlzc01ldGh5bDo6Z29tZXRoKGZfbmVzdGVkX2Fubm90W05hbWUgJWluJSBmZW1hbGVfZG1yX2NwZ3MkVjFdJE5hbWUsIGFycmF5LnR5cGUgPSAiRVBJQyIpICU+JSBhcnJhbmdlKFAuREUpCm1pc3NNZXRoeWw6OmdvbWV0aChmX25lc3RlZF9hbm5vdFtOYW1lICVpbiUgZmVtYWxlX2Rtcl9jcGdzJFYxXSROYW1lLCBhcnJheS50eXBlID0gIkVQSUMiLCBjb2xsZWN0aW9uID0gIktFR0ciKSAlPiUgYXJyYW5nZShQLkRFKQpgYGAKIyMjIyMgQ3BHIHNpdGVzIGZvciB3aGljaCBuZWl0aGVyIEcgb3IgRSBvdXRwZXJmb3JtZWQKCmBgYHtyfQpmZW1hbGVfZG1yX2NwZ3NbIWZlbWFsZV9kbXJfY3BncyRWMSAlaW4lIGZfbmVzdGVkX2Fubm90JE5hbWVdCm1hbGVfZG1yX2NwZ3NbIW1hbGVfZG1yX2NwZ3MkVjEgJWluJSBtX25lc3RlZF9hbm5vdCROYW1lXQpgYGAKCiMjIyBWaWV3aW5nIEcgYW5kIEUgZWZmZWN0cyBhbmQgY29tcGFyaW5nIHRvIGludGVyYWN0aW9uIG1vZGVsCmBgYHtyfQptYWxlX2dwZV9tb2RlbCA8LSBmcmVhZCgibWFsZV90ZXJyZV9wZF9mX0crRV9kbmFtX2JyZWFrZG93bi50eHQuZ3oiKQpmZW1hbGVfZ3BlX21vZGVsIDwtIGZyZWFkKCJmZW1hbGVfdGVycmVfcGRfZl9HK0VfZG5hbV9icmVha2Rvd24udHh0Lmd6IikKbWFsZV9ncGVfbW9kZWxbLCBgOj1gKEdxID0gcC5hZGp1c3QoR3AsIG1ldGhvZCA9ICJCSCIpLCBFcSA9IHAuYWRqdXN0KEVwLCBtZXRob2QgPSAiQkgiKSksIGJ5ID0gImVudiJdCmZlbWFsZV9ncGVfbW9kZWxbLCBgOj1gKEdxID0gcC5hZGp1c3QoR3AsIG1ldGhvZCA9ICJCSCIpLCBFcSA9IHAuYWRqdXN0KEVwLCBtZXRob2QgPSAiQkgiKSksIGJ5ID0gImVudiJdCmBgYApgYGB7cn0KbGVuZ3RoKHVuaXF1ZShtYWxlX2dwZV9tb2RlbFtHcSA8IDAuMDVdJGNwZykpCmxlbmd0aCh1bmlxdWUobWFsZV9ncGVfbW9kZWxbRXEgPCAwLjA1XSRjcGcpKQptYWxlX2dwZV9tb2RlbFtHcSA+IDAuMDUgJiBFcSA8IDAuMDVdCm1hbGVfZ3BlX21vZGVsW0dxIDwgMC4wNSAmIEVxID4gMC4wNV0KbWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1XQoKbGVuZ3RoKHVuaXF1ZShmZW1hbGVfZ3BlX21vZGVsW0dxIDwgMC4wNV0kY3BnKSkKbGVuZ3RoKHVuaXF1ZShmZW1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNV0kY3BnKSkKbGVuZ3RoKHVuaXF1ZShmZW1hbGVfZ3BlX21vZGVsJGNwZykpCmZlbWFsZV9ncGVfbW9kZWxbR3EgPiAwLjA1ICYgRXEgPCAwLjA1XQpmZW1hbGVfZ3BlX21vZGVsW0dxIDwgMC4wNSAmIEVxID4gMC4wNV0KZmVtYWxlX2dwZV9tb2RlbFtHcSA8IDAuMDUgJiBFcSA8IDAuMDVdCmBgYApgYGB7cn0KZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbLCAuKC1sb2cxMChHcCksIC1sb2cxMChFcCkpXSksIGFlcyh2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkKCiMgQ2hlY2sgRyBzaWcKZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1LCAuKEdlc3QsIEVlc3QpXSksIGFlcyh2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkKZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1LCAuKC1sb2cxMChHcCksIC1sb2cxMChFcCkpXSksIGFlcyh2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkKCgojIENoZWNrIEUgc2lnCmdncGxvdChtZWx0KG1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNSwgLihHZXN0LCBFZXN0KV0pLCBhZXModmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpCmdncGxvdChtZWx0KG1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNSwgLigtbG9nMTAoR3ApLCAtbG9nMTAoRXApKV0pLCBhZXModmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpCgojIGJvdGggRyBhbmQgRSBzaWcKZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1LCAuKC1sb2cxMChHcCksIC1sb2cxMChFcCkpXSksIGFlcyh2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkKCmdncGxvdChtYWxlX2dwZV9tb2RlbFtHcSA8IDAuMDUgJiBFcSA8IDAuMDUsIF0sIGFlcyhHZXN0LCBFZXN0LCBjb2xvciA9IGNwZykpICsKICBnZW9tX3BvaW50KCkKCmdncGxvdChtYWxlX2dwZV9tb2RlbFtHcSA8IDAuMDUgJiBFcSA8IDAuMDUsIF0sIGFlcygtbG9nMTAoR3ApLCAtbG9nMTAoRXApLCBjb2xvciA9IGNwZykpICsKICBnZW9tX3BvaW50KCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygyLCA1KSwgeWxpbSA9IGMoMiwgNSkpCgoKIyBFIHNpZyBHIG5vdCBzaWcKZ2dwbG90KG1hbGVfZ3BlX21vZGVsW0dxID4gMC4wNSAmIEVxIDwgMC4wNSwgXSwgYWVzKEdlc3QsIEVlc3QsIGNvbG9yID0gY3BnKSkgKwogIGdlb21fcG9pbnQoKQpnZ3Bsb3QobWVsdChtYWxlX2dwZV9tb2RlbFtHcSA+IDAuMDUgJiBFcSA8IDAuMDUsIC4oR2VzdCwgRWVzdCwgY3BnLCBTTlApXSksIGFlcyh2YXJpYWJsZSwgYWJzKHZhbHVlKSwgY29sb3IgPSBjcGcpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gaW50ZXJhY3Rpb24oU05QLCBjcGcpKSkgKwogIGZhY2V0X3dyYXAofmNwZykKZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPiAwLjA1ICYgRXEgPCAwLjA1LCAuKEdlc3QsIEVlc3QsIGNwZywgU05QKV0pLCBhZXModmFyaWFibGUsIGFicyh2YWx1ZSksIGNvbG9yID0gY3BnKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGZhY2V0X3dyYXAofmNwZykKCmdncGxvdChtYWxlX2dwZV9tb2RlbFtHcSA+IDAuMDUgJiBFcSA8IDAuMDUsIF0sIGFlcygtbG9nMTAoR3ApLCAtbG9nMTAoRXApLCBjb2xvciA9IGNwZykpICsKICBnZW9tX3BvaW50KCkKYGBgCiMjIyMgaXMgdGhlcmUgaW50ZXJhY3Rpb24gYXQgdGhlc2Ugc2l0ZXMgd2l0aCBzaWduaWZpY2FudCBHIGFuZCBFPwpgYGB7cn0KbWFsZV9ncGVfaW50ZXJlc3QgPC0gbWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1LCBdCihtZXJnZShtYWxlX25lc3RlZCwgbWFsZV9ncGVfaW50ZXJlc3QsIGJ5LnggPSBjKCJjcGciLCAic25wIiwgImVudiIpLCBieS55ID0gYygiY3BnIiwgIlNOUCIsICJlbnYiKSkpCm1hbGVfbmVzdGVkW2ZfcV9neGUgPCAwLjA1XQpgYGAKYGBge3J9CmdncGxvdChtZWx0KGZlbWFsZV9ncGVfbW9kZWxbLCAuKC1sb2cxMChHcCksIC1sb2cxMChFcCkpXSksIGFlcyh2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkKCiMgQ2hlY2sgRyBzaWcKZ2dwbG90KG1lbHQoZmVtYWxlX2dwZV9tb2RlbFtHcSA8IDAuMDUsIC4oR2VzdCwgRWVzdCldKSAlPiUgbXV0YXRlKHZhcmlhYmxlID0gcmVjb2RlKHZhcmlhYmxlLCAiVjEiID0gIkdfZWZmZWN0IiwgIlYyIiA9ICJFX2VmZmVjdCIpKSwgYWVzKHZhbHVlLCBmaWxsID0gdmFyaWFibGUpKSArCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIGVmZmVjdCBzaXplcyBmb3Igc2lnbmlmaWNhbnQgRyBtb2RlbHMiKQpnZ3Bsb3QobWVsdChmZW1hbGVfZ3BlX21vZGVsW0dxIDwgMC4wNSwgLigtbG9nMTAoR3ApLCAtbG9nMTAoRXApKV0pICU+JSBtdXRhdGUodmFyaWFibGUgPSByZWNvZGUodmFyaWFibGUsICJWMSIgPSAiLWxvZzEwKEdwKSIsICJWMiIgPSAiLWxvZzEwKEVwKSIpKSwgYWVzKHZhbHVlLCBmaWxsID0gdmFyaWFibGUpKSArCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIFAgdmFsdWVzIGZvciBzaWduaWZpY2FudCBHIG1vZGVscyIpCgoKIyBDaGVjayBFIHNpZwpnZ3Bsb3QobWVsdChmZW1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNSwgLihHZXN0LCBFZXN0KV0pLCBhZXModmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpCmdncGxvdChtZWx0KGZlbWFsZV9ncGVfbW9kZWxbRXEgPCAwLjA1LCAuKC1sb2cxMChHcCksIC1sb2cxMChFcCkpXSksIGFlcyh2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkKCiMgYm90aCBHIGFuZCBFIHNpZwpnZ3Bsb3QobWVsdChmZW1hbGVfZ3BlX21vZGVsW0dxIDwgMC4wNSAmIEVxIDwgMC4wNSwgLigtbG9nMTAoR3ApLCAtbG9nMTAoRXApKV0pLCBhZXModmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpCgpnZ3Bsb3QoZmVtYWxlX2dwZV9tb2RlbFtHcSA8IDAuMDUgJiBFcSA8IDAuMDUsIF0sIGFlcyhHZXN0LCBFZXN0LCBjb2xvciA9IGNwZykpICsKICBnZW9tX3BvaW50KCkKCmdncGxvdChmZW1hbGVfZ3BlX21vZGVsW0dxIDwgMC4wNSAmIEVxIDwgMC4wNSwgXSwgYWVzKC1sb2cxMChHcCksIC1sb2cxMChFcCksIGNvbG9yID0gY3BnKSkgKwogIGdlb21fcG9pbnQoKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDIsIDUpLCB5bGltID0gYygyLCA1KSkKCgojIEUgc2lnIEcgbm90IHNpZwpnZ3Bsb3QoZmVtYWxlX2dwZV9tb2RlbFtHcSA+IDAuMDUgJiBFcSA8IDAuMDUsIF0sIGFlcyhHZXN0LCBFZXN0LCBjb2xvciA9IGNwZykpICsKICBnZW9tX3BvaW50KCkKCmdncGxvdChmZW1hbGVfZ3BlX21vZGVsW0dxID4gMC4wNSAmIEVxIDwgMC4wNSwgXSwgYWVzKC1sb2cxMChHcCksIC1sb2cxMChFcCksIGNvbG9yID0gY3BnKSkgKwogIGdlb21fcG9pbnQoKQpgYGAKCiMjIyBDb21wYXJpbmcgJFJeMiQgZm9yIGVhY2ggbW9kZWwKYGBge3J9Cm1hbGVfZ3hlX21vZGVsIDwtIGZyZWFkKCJtYWxlX3RlcnJlX3BkX2ZfR3hFX2RuYW1fYnJlYWtkb3duLnR4dC5neiIpCmZlbWFsZV9neGVfbW9kZWwgPC0gZnJlYWQoImZlbWFsZV90ZXJyZV9wZF9mX0d4RV9kbmFtX2JyZWFrZG93bi50eHQuZ3oiKQpgYGAKCmBgYHtyfQpneGVfdnNfZ3BlIDwtIGRhdGEuZnJhbWUoZ3hlX3IyID0gbWFsZV9neGVfbW9kZWwkUjIsIGdwZV9yMiA9IG1hbGVfZ3BlX21vZGVsJFIyKQpnZ3Bsb3QoZ3hlX3ZzX2dwZSwgYWVzKGd4ZV9yMiwgZ3BlX3IyKSkgKwogIGdlb21fYmluMmQoKQpneGVfdnNfZ3BlIDwtIGRhdGEuZnJhbWUoZ3hlX3IyID0gZmVtYWxlX2d4ZV9tb2RlbCRSMiwgZ3BlX3IyID0gZmVtYWxlX2dwZV9tb2RlbCRSMikKZ2dwbG90KGd4ZV92c19ncGUsIGFlcyhneGVfcjIsIGdwZV9yMikpICsKICBnZW9tX2JpbjJkKCkKYGBgCgojIyMgQWRkaXRpb25hbCBsYXN0IHF1ZXN0aW9ucwojIyMjIHdoYXQgcHJvcG9ydGlvbiBvZiBDcEdzIGhhdmUgbmVpdGhlciBHIG5vciBFIGVmZmVjdAoKYGBge3J9CmZlbWFsZV9kbXJfY3BncyA8LSBmcmVhZCgifi9BSUNfRi5jc3YiKQptYWxlX2Rtcl9jcGdzIDwtIGZyZWFkKCJ+L0FJQ19NLmNzdiIpCmVmZmVjdF9jcGdzX21hbGUgPC0gdW5pcXVlKG1hbGVfZ3BlX21vZGVsWyhHcSA8IDAuMDUgfCBFcSA8IDAuMDUpICYgY3BnICVpbiUgbWFsZV9kbXJfY3BncyRDcEddJGNwZykKZWZmZWN0X2NwZ3NfZmVtYWxlIDwtIHVuaXF1ZShmZW1hbGVfZ3BlX21vZGVsWyhHcSA8IDAuMDUgfCBFcSA8IDAuMDUpICYgY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJENwR10kY3BnKQoKbGVuZ3RoKHVuaXF1ZShtYWxlX2dwZV9tb2RlbFtjcGcgJWluJSBtYWxlX2Rtcl9jcGdzJENwR10kY3BnKSkgLSBsZW5ndGgoZWZmZWN0X2NwZ3NfbWFsZSkKCmxlbmd0aCh1bmlxdWUobWFsZV9ncGVfbW9kZWxbY3BnICVpbiUgbWFsZV9kbXJfY3BncyRDcEddJGNwZykpCgpzdW0oIXVuaXF1ZShtYWxlX2dwZV9tb2RlbFtjcGcgJWluJSBtYWxlX2Rtcl9jcGdzJENwR10kY3BnKSAlaW4lIGVmZmVjdF9jcGdzX21hbGUpIC8gbGVuZ3RoKHVuaXF1ZShtYWxlX2dwZV9tb2RlbFtjcGcgJWluJSBtYWxlX2Rtcl9jcGdzJENwR10kY3BnKSkKCgpsZW5ndGgodW5pcXVlKGZlbWFsZV9ncGVfbW9kZWxbY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJENwR10kY3BnKSkgLSBsZW5ndGgoZWZmZWN0X2NwZ3NfZmVtYWxlKQpsZW5ndGgodW5pcXVlKGZlbWFsZV9ncGVfbW9kZWxbY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJENwR10kY3BnKSkKc3VtKCF1bmlxdWUoZmVtYWxlX2dwZV9tb2RlbFtjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkQ3BHXSRjcGcpICVpbiUgZWZmZWN0X2NwZ3NfZmVtYWxlKSAvIGxlbmd0aCh1bmlxdWUoZmVtYWxlX2dwZV9tb2RlbFtjcGcgJWluJSBmZW1hbGVfZG1yX2NwZ3MkQ3BHXSRjcGcpKQoKdW5pcXVlKG1hbGVfZ3BlX21vZGVsWyhHcSA8IDAuMDUgJiBFcSA8IDAuMDUpICYgY3BnICVpbiUgbWFsZV9kbXJfY3BncyRDcEddJGNwZykKCgojIHdyaXRlLmNzdihtYWxlX2Rtcl9jcGdzWyFWMSAlaW4lIGVmZmVjdF9jcGdzX21hbGVdKQojIHdyaXRlLmNzdihmZW1hbGVfZG1yX2NwZ3NbIVYxICVpbiUgZWZmZWN0X2NwZ3NfZmVtYWxlXSkKCndyaXRlLmNzdihtYWxlX2dwZV9tb2RlbFshY3BnICVpbiUgZWZmZWN0X2NwZ3NfbWFsZSAmIGNwZyAlaW4lIG1hbGVfZG1yX2NwZ3MkVjEsLlNEW3doaWNoLm1pbihhaWMpXSxieT1jcGddKQp3cml0ZS5jc3YoZmVtYWxlX2dwZV9tb2RlbFshY3BnICVpbiUgZWZmZWN0X2NwZ3NfZmVtYWxlICYgY3BnICVpbiUgZmVtYWxlX2Rtcl9jcGdzJFYxLC5TRFt3aGljaC5taW4oYWljKV0sYnk9Y3BnXSkKYGBgCgojIyMjIGlzIEcgZWZmZWN0IGdlbmVyYWxseSBtb3JlIGltcGFjdGZ1bC9sYXJnZXIgdGhhbiBFIGVmZmVjdD8KYGBge3J9CmxpYnJhcnkoZ2dwdWJyKQptYWxlX3RtcCA8LSBtYWxlX2dwZV9tb2RlbAptYWxlX3RtcCRTZXggPC0gIk1hbGUiCmZlbWFsZV90bXAgPC0gZmVtYWxlX2dwZV9tb2RlbApmZW1hbGVfdG1wJFNleCA8LSAiRmVtYWxlIgptYWxlX2ZlbWFsZV9ncGUgPC0gcmJpbmQobWFsZV90bXAsIGZlbWFsZV90bXApCm1hbGVfZmVtYWxlX21heF9ncGVfZWZmZWN0cyA8LSBtZWx0KG1hbGVfZmVtYWxlX2dwZVssIC4oRyA9IG1heChhYnMoR2VzdCkpLCBFID0gbWF4KGFicyhFZXN0KSkpLCBieSA9IGMoImNwZyIsICJTZXgiKV0pCmNvci50ZXN0KG1hbGVfZ3BlX21vZGVsJEd0LCBtYWxlX2dwZV9tb2RlbCRFdCwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QobWFsZV9ncGVfbW9kZWwkR2VzdCwgbWFsZV9ncGVfbW9kZWwkRWVzdCwgbWV0aG9kID0gInNwZWFybWFuIikKCmNvci50ZXN0KGZlbWFsZV9ncGVfbW9kZWwkR3QsIGZlbWFsZV9ncGVfbW9kZWwkRXQsIG1ldGhvZCA9ICJzcGVhcm1hbiIpCmNvci50ZXN0KGZlbWFsZV9ncGVfbW9kZWwkR2VzdCwgZmVtYWxlX2dwZV9tb2RlbCRFZXN0LCBtZXRob2QgPSAic3BlYXJtYW4iKQoKbWFsZV9mZW1hbGVfZ3BlWywgLihHID0gbWF4KGFicyhHZXN0KSksIEUgPSBtYXgoYWJzKEVlc3QpKSwgR3EgPSBHcVt3aGljaC5tYXgoYWJzKEdlc3QpKV0sIEVxID0gRXFbd2hpY2gubWF4KGFicyhFZXN0KSldKSwgYnkgPSBjKCJjcGciLCAiU2V4IildCm1hbGVfZmVtYWxlX21heF9ncGVfZWZmZWN0c19zaWcgPC0gbWVsdChtYWxlX2ZlbWFsZV9ncGVbLCAuKEcgPSBtYXgoYWJzKEdlc3RbR3EgPCAwLjA1XSkpLCBFID0gbWF4KGFicyhFZXN0W0VxIDwgMC4wNV0pKSksIGJ5ID0gYygiY3BnIiwgIlNleCIpXSlbIWlzLmluZmluaXRlKHZhbHVlKV0KCgpwMSA8LSBnZ2JveHBsb3QobWFsZV9mZW1hbGVfbWF4X2dwZV9lZmZlY3RzW1NleCA9PSAiTWFsZSJdLCAidmFyaWFibGUiLCAidmFsdWUiLCBmaWxsID0gIlNleCIsIHBhbGV0dGUgPSBjKCJsaWdodHN0ZWVsYmx1ZTIiKSwgZ3JvdXAgPSAidmFyaWFibGUiKSArIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygiRyIsICJFIikpKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICIiKSArIGxhYnMoeCA9ICJWYXJpYWJsZSIsIHkgPSAifEVmZmVjdHwiKQoKcDIgPC0gZ2dib3hwbG90KG1hbGVfZmVtYWxlX21heF9ncGVfZWZmZWN0c1tTZXggPT0gIkZlbWFsZSJdLCAidmFyaWFibGUiLCAidmFsdWUiLCBmaWxsID0gIlNleCIsIHBhbGV0dGUgPSBjKCJsaWdodHBpbmsyIiksIGdyb3VwID0gInZhcmlhYmxlIikgKyBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkciLCAiRSIpKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiIikgKyBsYWJzKHggPSAiVmFyaWFibGUiLCB5ID0gInxFZmZlY3R8IikKCnAzIDwtIGdnYm94cGxvdChtYWxlX2ZlbWFsZV9tYXhfZ3BlX2VmZmVjdHNfc2lnW1NleCA9PSAiTWFsZSJdLCAidmFyaWFibGUiLCAidmFsdWUiLCBmaWxsID0gIlNleCIsIHBhbGV0dGUgPSBjKCJsaWdodHN0ZWVsYmx1ZTIiKSkgKyBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkciLCAiRSIpKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiIikgKyBsYWJzKHggPSAiVmFyaWFibGUiLCB5ID0gInxFZmZlY3R8IikKCgpwNCA8LSBnZ2JveHBsb3QobWFsZV9mZW1hbGVfbWF4X2dwZV9lZmZlY3RzX3NpZ1tTZXggPT0gIkZlbWFsZSJdLCAidmFyaWFibGUiLCAidmFsdWUiLCBmaWxsID0gIlNleCIsIHBhbGV0dGUgPSBjKCJsaWdodHBpbmsyIikpICsgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJHIiwgIkUiKSkpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIiIpCnA0CmNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBucm93ID0gMSwgbGFiZWxzID0gIkFVVE8iKQpgYGAKIyMjIyBTYW1lIGFzIHByZXZpb3VzIGJ1dCB3aXRoIHQgc3RhdGlzdGljcwpgYGB7cn0KCm1hbGVfZmVtYWxlX21heF9ncGVfdCA8LSBtZWx0KG1hbGVfZmVtYWxlX2dwZVssIC4oR3QgPSBtYXgoYWJzKEd0KSksIEV0ID0gbWF4KGFicyhFdCkpKSwgYnkgPSBjKCJjcGciLCAiU2V4IildKQoKbWFsZV9mZW1hbGVfbWF4X2dwZV90X3NpZyA8LSBtZWx0KG1hbGVfZmVtYWxlX2dwZVssIC4oR3QgPSBtYXgoYWJzKEd0W0dxIDwgMC4wNV0pKSwgRXQgPSBtYXgoYWJzKEV0W0VxIDwgMC4wNV0pKSksIGJ5ID0gYygiY3BnIiwgIlNleCIpXSlbIWlzLmluZmluaXRlKHZhbHVlKV0KCnAxIDwtIGdnYm94cGxvdChtYWxlX2ZlbWFsZV9tYXhfZ3BlX3RbU2V4ID09ICJNYWxlIl0sICJ2YXJpYWJsZSIsICJ2YWx1ZSIsIGZpbGwgPSAiU2V4IiwgcGFsZXR0ZSA9IGMoImxpZ2h0c3RlZWxibHVlMiIpLCBncm91cCA9ICJ2YXJpYWJsZSIpICsgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJHdCIsICJFdCIpKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiIikgKyBsYWJzKHggPSAiVmFyaWFibGUiLCB5ID0gInxFZmZlY3R8IikKCnAyIDwtIGdnYm94cGxvdChtYWxlX2ZlbWFsZV9tYXhfZ3BlX3RbU2V4ID09ICJGZW1hbGUiXSwgInZhcmlhYmxlIiwgInZhbHVlIiwgZmlsbCA9ICJTZXgiLCBwYWxldHRlID0gYygibGlnaHRwaW5rMiIpLCBncm91cCA9ICJ2YXJpYWJsZSIpICsgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJHdCIsICJFdCIpKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiIikgKyBsYWJzKHggPSAiVmFyaWFibGUiLCB5ID0gInxFZmZlY3R8IikKCnAzIDwtIGdnYm94cGxvdChtYWxlX2ZlbWFsZV9tYXhfZ3BlX3Rfc2lnW1NleCA9PSAiTWFsZSJdLCAidmFyaWFibGUiLCAidmFsdWUiLCBmaWxsID0gIlNleCIsIHBhbGV0dGUgPSBjKCJsaWdodHN0ZWVsYmx1ZTIiKSkgKyBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkd0IiwgIkV0IikpKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICIiKSArIGxhYnMoeCA9ICJWYXJpYWJsZSIsIHkgPSAifEVmZmVjdHwiKQoKCnA0IDwtIGdnYm94cGxvdChtYWxlX2ZlbWFsZV9tYXhfZ3BlX3Rfc2lnW1NleCA9PSAiRmVtYWxlIl0sICJ2YXJpYWJsZSIsICJ2YWx1ZSIsIGZpbGwgPSAiU2V4IiwgcGFsZXR0ZSA9IGMoImxpZ2h0cGluazIiKSkgKyBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkd0IiwgIkV0IikpKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICIiKQpwNApjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMywgbnJvdyA9IDEsIGxhYmVscyA9ICJBVVRPIikKbWVhbihtYWxlX2ZlbWFsZV9tYXhfZ3BlX3RbU2V4ID09ICJNYWxlIiAmIHZhcmlhYmxlID09ICJHdCJdJHZhbHVlKQptZWFuKG1hbGVfZmVtYWxlX21heF9ncGVfdFtTZXggPT0gIk1hbGUiICYgdmFyaWFibGUgPT0gIkV0Il0kdmFsdWUpCm1lYW4obWFsZV9mZW1hbGVfbWF4X2dwZV90W1NleCA9PSAiRmVtYWxlIiAmIHZhcmlhYmxlID09ICJHdCJdJHZhbHVlKQptZWFuKG1hbGVfZmVtYWxlX21heF9ncGVfdFtTZXggPT0gIkZlbWFsZSIgJiB2YXJpYWJsZSA9PSAiRXQiXSR2YWx1ZSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTd9Cm1hbGVfZmVtYWxlX2dwZV9hbGwgPC0gbWVsdChtYWxlX2ZlbWFsZV9ncGVbLCAuKEd0ID0gYWJzKEd0KSwgRXQgPSBhYnMoRXQpKSwgYnkgPSBjKCJjcGciLCAiU2V4IiwgImVudiIpXSkKZ2dib3hwbG90KG1hbGVfZmVtYWxlX2dwZV9hbGxbU2V4ID09ICJNYWxlIl0sICJ2YXJpYWJsZSIsICJ2YWx1ZSIsIGZpbGwgPSAiU2V4IiwgcGFsZXR0ZSA9IGMoImxpZ2h0c3RlZWxibHVlMiIpLCBncm91cCA9ICJ2YXJpYWJsZSIpICsgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJHdCIsICJFdCIpKSkgKyBmYWNldF93cmFwKH5lbnYpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIiIpICsgbGFicyh4ID0gIlZhcmlhYmxlIiwgeSA9ICJ8RWZmZWN0fCIpCgpnZ2JveHBsb3QobWFsZV9mZW1hbGVfZ3BlX2FsbFtTZXggPT0gIkZlbWFsZSJdLCAidmFyaWFibGUiLCAidmFsdWUiLCBmaWxsID0gIlNleCIsIHBhbGV0dGUgPSBjKCJsaWdodHBpbmsyIiksIGdyb3VwID0gInZhcmlhYmxlIikgKyBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkd0IiwgIkV0IikpKSArIGZhY2V0X3dyYXAofmVudikgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiIikgKyBsYWJzKHggPSAiVmFyaWFibGUiLCB5ID0gInxFZmZlY3R8IikKYGBgCgojIyMjIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWZmZXJlbmNlcwpgYGB7cn0Kel9zY29yZXNfZGYgPC0gbWFsZV9mZW1hbGVfZ3BlWywgYDo9YChaZ2UgPSAoYWJzKEdlc3QpIC0gYWJzKEVlc3QpKSAvIHNxcnQoR3NlXjIgKyBFc2VeMikpXQpwMSA8LSBnZ3Bsb3Qoel9zY29yZXNfZGYsIGFlcyhaZ2UsIGZpbGwgPSBTZXgpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCwgcG9zaXRpb24gPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRwaW5rMiIsICJsaWdodHN0ZWVsYmx1ZTIiKSkgKwogIHRoZW1lX2NsYXNzaWMoKQp6X3Njb3Jlc19kZlssIGA6PWAoWmdyZWF0ZXJwID0gcG5vcm0oWmdlKSldICMgb25lLXNpZGVkICwgRSBncmVhdGVyIHRoYW4gRwp6X3Njb3Jlc19kZlssIGA6PWAoWmxlc3NwID0gcG5vcm0oLVpnZSkpXSAjIG9uZS1zaWRlZCwgRyBncmVhdGVyIHRoYW4gRQp6X3Njb3Jlc19kZlssIGA6PWAoWmdyZWF0ZXJxID0gcC5hZGp1c3QoWmdyZWF0ZXJwLCBtZXRob2QgPSAiQkgiKSksIGJ5ID0gImVudiJdCnpfc2NvcmVzX2RmWywgYDo9YChabGVzc3EgPSBwLmFkanVzdChabGVzc3AsIG1ldGhvZCA9ICJCSCIpKSwgYnkgPSAiZW52Il0KI1R3by1zaWRlZAp6X3Njb3Jlc19kZlssIGA6PWAoWnAgPSAyKnBub3JtKC1hYnMoWmdlKSkpXSAjIG9uZS1zaWRlZCAsIEUgZ3JlYXRlciB0aGFuIEcKel9zY29yZXNfZGZbLCBgOj1gKFpxID0gcC5hZGp1c3QoWnAsbWV0aG9kPSJCSCIpKSxieT0iZW52Il0KCiMgel9zY29yZXNfZGZbWmxlc3NxIDwgMC4wNV0Kel9zY29yZXNfZGZbWmxlc3NxIDwgMC4wNSwgLihDcEcgPSB1bmlxdWVOKGNwZykpLCBieSA9IGMoImVudiIsICJTZXgiKV0KcDIgPC0gZ2dwbG90KHpfc2NvcmVzX2RmW1psZXNzcSA8IDAuMDUsIC4oQ3BHID0gdW5pcXVlTihjcGcpKSwgYnkgPSBjKCJlbnYiLCAiU2V4IildLCBhZXMoZW52LCBDcEcsIGZpbGwgPSBTZXgpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDcEcpLCBzaXplID0gNCx2anVzdD0tMC41LCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRwaW5rMiIsICJsaWdodHN0ZWVsYmx1ZTIiKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpwMgojIGdncGxvdCh6X3Njb3Jlc19kZltaZ3JlYXRlcnEgPCAwLjA1LCAuKENwRyA9IHVuaXF1ZU4oY3BnKSksIGJ5ID0gYygiZW52IiwgIlNleCIpXSwgYWVzKGVudiwgQ3BHLCBmaWxsID0gU2V4KSkgKwojICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwojICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENwRyksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0cGluazIiLCAibGlnaHRzdGVlbGJsdWUyIikpICsKIyAgIHRoZW1lX2NsYXNzaWMoKSArCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCiMgZ2dwbG90KHpfc2NvcmVzX2RmW1psZXNzcSA8IDAuMDUsLlNEW3doaWNoLm1heChhYnMoWmdlKSldLGJ5ID0gYygiY3BnIiwiZW52IildLGFlcyhlbnYsZmlsbCA9IFNleCkpICsKIyAgICAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIscG9zaXRpb24gPSJkb2RnZSIpKwojIGdlb21fdGV4dChhZXMobGFiZWw9Li5jb3VudC4uKSwgc3RhdD0iY291bnQiKSsKIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJsaWdodHBpbmsyIiwibGlnaHRzdGVlbGJsdWUyIikpICsKIyB0aGVtZV9jbGFzc2ljKCkKIyBnZ3Bsb3Qoel9zY29yZXNfZGZbWmdyZWF0ZXJxIDwgMC4wNSwuU0Rbd2hpY2gubWF4KGFicyhaZ2UpKV0sYnkgPSBjKCJjcGciLCJlbnYiKV0sYWVzKGVudixmaWxsID0gU2V4KSkgKwojICAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpKwojICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPS4uY291bnQuLiksIHN0YXQ9ImNvdW50IikrCiMgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0cGluazIiLCJsaWdodHN0ZWVsYmx1ZTIiKSkgKwojICAgICB0aGVtZV9jbGFzc2ljKCkKY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgbGFiZWxzID0gIkFVVE8iLCBucm93ID0gMSkKdG90YWxfbWFsZSA8LSBucm93KHpfc2NvcmVzX2RmWyFkdXBsaWNhdGVkKGNwZykgJiBTZXggPT0gIk1hbGUiXSkKdG90YWxfZmVtYWxlIDwtIG5yb3coel9zY29yZXNfZGZbIWR1cGxpY2F0ZWQoY3BnKSAmIFNleCA9PSAiRmVtYWxlIl0pCnAzIDwtIGdncGxvdCh6X3Njb3Jlc19kZlssIC4oQ3BHID0gaWZlbHNlKFNleCA9PSAiTWFsZSIsIHRvdGFsX21hbGUgLSB1bmlxdWVOKGNwZ1tabGVzc3EgPCAwLjA1XSksIHRvdGFsX2ZlbWFsZSAtIHVuaXF1ZU4oY3BnW1psZXNzcSA8IDAuMDVdKSkpLCBieSA9IGMoImVudiIsICJTZXgiKV0sIGFlcyhlbnYsIENwRywgZmlsbCA9IFNleCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENwRyksIHNpemUgPSA0LCB2anVzdD0tMC41LCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRwaW5rMiIsICJsaWdodHN0ZWVsYmx1ZTIiKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgI2dndGl0bGUoIk5vIGRpZmZlcmVuY2UgaW4gZWl0aGVyIEcgb3IgRSBlZmZlY3QiKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKcDEgCnAyICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMjI1KSkKcDMgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCw5MjUpKQpgYGAKCiMjIyMgRGlmZmVyZW5jZSBpbiB6IHNjb3JlcyBtYWxlcyB2cyBmZW1hbGVzCmBgYHtyfQoodG1wIDwtIHdpbGNveC50ZXN0KHpfc2NvcmVzX2RmW1NleCA9PSAiTWFsZSIgJiBacSA8IDAuMDVdJFpnZSx6X3Njb3Jlc19kZltTZXggPT0gIkZlbWFsZSIgJiBacSA8IDAuMDVdJFpnZSxhbHRlcm5hdGl2ZSA9ICJsIikpCnRtcCRwLnZhbHVlCgoodG1wIDwtIHQudGVzdCh6X3Njb3Jlc19kZltTZXggPT0gIk1hbGUiICYgWnEgPCAwLjA1XSRaZ2Usel9zY29yZXNfZGZbU2V4ID09ICJGZW1hbGUiICYgWnEgPCAwLjA1XSRaZ2UsYWx0ZXJuYXRpdmUgPSAiZyIpKQp0bXAkcC52YWx1ZQoKKHRtcCA8LSB3aWxjb3gudGVzdCh6X3Njb3Jlc19kZltTZXggPT0gIk1hbGUiICYgWnEgPCAwLjA1XSRaZ2UsYWx0ZXJuYXRpdmUgPSAiZyIpKQp0bXAkcC52YWx1ZQoodG1wIDwtIHdpbGNveC50ZXN0KHpfc2NvcmVzX2RmW1NleCA9PSAiRmVtYWxlIiAmIFpxIDwgMC4wNV0kWmdlLGFsdGVybmF0aXZlID0gImciKSkKdG1wJHAudmFsdWUKYGBgCgoKCiMjIyMgV2hhdCBFIGVmZmVjdHMgb3ZlcmxhcCB3aXRoIEcgZWZmZWN0PwpgYGB7cixmaWcuaGVpZ2h0PTV9CmdncGxvdChtZWx0KG1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNSwgLihHZXN0LCBFZXN0LCBjcGcsIFNOUCldKSwgYWVzKHZhcmlhYmxlLCBhYnModmFsdWUpLCBjb2xvciA9IGNwZykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBpbnRlcmFjdGlvbihTTlAsIGNwZykpKSArCiAgZmFjZXRfd3JhcCh+Y3BnKQpnZ2JveHBsb3QoCiAgbWVsdChtYWxlX2dwZV9tb2RlbFtFcSA8IDAuMDUsIC4oRyA9IGFicyhHZXN0KSwgRSA9IGFicyhFZXN0KSwgY3BnLCBTTlApXSksCiAgInZhcmlhYmxlIiwKICAidmFsdWUiLAogIGZhY2V0LmJ5ID0gImNwZyIsCiAgZmlsbCA9ICJsaWdodHN0ZWVsYmx1ZTIiCikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygiRyIsICJFIikpLCB2anVzdCA9IDEuMSwgdGlwLmxlbmd0aCA9IDApICsKICB0aGVtZV9jbGFzc2ljKCkKCgoKZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1LCAuKEd0LCBFdCwgY3BnLCBTTlApXSksIGFlcyh2YXJpYWJsZSwgYWJzKHZhbHVlKSwgY29sb3IgPSBjcGcpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gaW50ZXJhY3Rpb24oU05QLCBjcGcpKSkgKwogIGZhY2V0X3dyYXAofmNwZykKZ2dib3hwbG90KAogIG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1LCAuKEcgPSBhYnMoR3QpLCBFID0gYWJzKEV0KSwgY3BnLCBTTlApXSksCiAgInZhcmlhYmxlIiwKICAidmFsdWUiLAogIGZhY2V0LmJ5ID0gImNwZyIsCiAgZmlsbCA9ICJsaWdodHN0ZWVsYmx1ZTIiCikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygiRyIsICJFIikpLCB2anVzdCA9IDEuMiwgdGlwLmxlbmd0aCA9ICkgKwogIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9ICJWYXJpYWJsZSIsIHkgPSAifEVmZmVjdHwiKQpgYGAKYGBge3J9CmdncGxvdChtZWx0KG1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNSwgLihHdCwgRXQsIGNwZywgU05QKV0pLCBhZXModmFyaWFibGUsIGFicyh2YWx1ZSksIGNvbG9yID0gY3BnKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGludGVyYWN0aW9uKFNOUCwgY3BnKSkpICsKICBmYWNldF93cmFwKH5jcGcpCmdnYm94cGxvdCgKICBtZWx0KG1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNSwgLihHID0gYWJzKEd0KSwgRSA9IGFicyhFdCksIGNwZywgU05QKV0pLAogICJ2YXJpYWJsZSIsCiAgInZhbHVlIiwKICBmYWNldC5ieSA9ICJjcGciLAogIHBhbGV0dGUgPSBjKCksCiAgZmlsbCA9ICJsaWdodHN0ZWVsYmx1ZTIiCikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygiRyIsICJFIikpLCB2anVzdCA9IDEuMSwgdGlwLmxlbmd0aCA9IDApICsKICB0aGVtZV9jbGFzc2ljKCkKCgoKZ2dwbG90KG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1LCAuKEd0LCBFdCwgY3BnLCBTTlApXSksIGFlcyh2YXJpYWJsZSwgYWJzKHZhbHVlKSwgY29sb3IgPSBjcGcpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gaW50ZXJhY3Rpb24oU05QLCBjcGcpKSkgKwogIGZhY2V0X3dyYXAofmNwZykKZ2dib3hwbG90KAogIG1lbHQobWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1ICYgRXEgPCAwLjA1LCAuKEcgPSBhYnMoR3QpLCBFID0gYWJzKEV0KSwgY3BnLCBTTlApXSksCiAgInZhcmlhYmxlIiwKICAidmFsdWUiLAogIGZhY2V0LmJ5ID0gImNwZyIsCiAgZmlsbCA9ICJsaWdodHN0ZWVsYmx1ZTIiCikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygiRyIsICJFIikpLCB2anVzdCA9IDEuMiwgdGlwLmxlbmd0aCA9ICkgKwogIHRoZW1lX2NsYXNzaWMoKSArIGxhYnMoeCA9ICJWYXJpYWJsZSIsIHkgPSAifHR8IikKYGBgCgoKIyMjIyBXaGljaCBwZXN0aWNpZGVzIGFuZCB3aGljaCBTTlBzCmBgYHtyfQp1bmlxdWUobWFsZV9ncGVfbW9kZWxbRXEgPCAwLjA1XSRlbnYpCnVuaXF1ZShmZW1hbGVfZ3BlX21vZGVsW0VxIDwgMC4wNV0kZW52KQoKbWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1LCAuU0Rbd2hpY2gubWluKEdxKV0sIGJ5ID0gImNwZyJdCmZlbWFsZV9ncGVfbW9kZWxbR3EgPCAwLjA1LCAuU0Rbd2hpY2gubWluKEdxKV0sIGJ5ID0gImNwZyJdCgptYWxlc19wZF9HIDwtIG1hbGVzX3BkW21vZGVsID09ICJHIl0KbWFsZXNfcGRfRyRHcSA8LSBwLmFkanVzdChtYWxlc19wZF9HJEdwLCBtZXRob2QgPSAiQkgiKQpmZW1hbGVzX3BkX0cgPC0gZmVtYWxlc19wZFttb2RlbCA9PSAiRyJdCmZlbWFsZXNfcGRfRyRHcSA8LSBwLmFkanVzdChmZW1hbGVzX3BkX0ckR3AsIG1ldGhvZCA9ICJCSCIpCgptYWxlc19wZF9HW0dxIDwgMC4wNSwgLlNEW3doaWNoLm1pbihHcSldLCBieSA9ICJjcGciXQpmZW1hbGVzX3BkX0dbR3EgPCAwLjA1LCAuU0Rbd2hpY2gubWluKEdxKV0sIGJ5ID0gImNwZyJdCmBgYAoKIyMjIG1vZGVsIFJhbmtpbmcgZmluYWwgcmVzdWx0cwoKIyMjIyBQbG90IGludGVyYWN0aW9uIGZvciBHeEUgaW4gZmVtYWxlcwpgYGB7cn0KCmBgYAojIyMgUmVwbGljYXRpb24gb2YgRyBtb2RlbHMgaW4gRElQR0QKCmBgYHtyfQpmZW1hbGVfZ19kaWdwZCA8LSBmcmVhZCgiZmVtYWxlX2RpZ3BkX3BkX2ZfR19kbmFtX2JyZWFrZG93bi50eHQuZ3oiKQpmX2RtcnNfZGlncGQgPC0gZnJlYWQoIi9ob21lMS9ORVVSTy9TSEFSRV9ERUNJUEhFUi9ETVJzL0RJR1BEL3NpZy5jcGdzLkRJR1BELkYuY3N2IilbLCAuU0Rbd2hpY2gubWluKEhNRkRSKV0sIGJ5ID0gImRtciJdCmZlbWFsZV9nX2RpZ3BkWywgYDo9YChHcSA9IHAuYWRqdXN0KEdwLCBtZXRob2QgPSAiQkgiKSldCnNpZ19mZW1hbGVfR19kaWdwZCA8LSBtZXJnZShmX2RtcnNfZGlncGQsIGZlbWFsZV9nX2RpZ3BkW0dxIDwgMC4wNSwgLlNEW3doaWNoLm1pbihHcSldLCBieSA9ICJjcGciXSwgYnkgPSAiY3BnIikKCm1hbGVfZ19kaWdwZCA8LSBmcmVhZCgibWFsZV9kaWdwZF9wZF9mX0dfZG5hbV9icmVha2Rvd24udHh0Lmd6IikKbV9kbXJzX2RpZ3BkIDwtIGZyZWFkKCIvaG9tZTEvTkVVUk8vU0hBUkVfREVDSVBIRVIvRE1Scy9ESUdQRC9zaWcuY3Bncy5ESUdQRC5NLmNzdiIpWywgLlNEW3doaWNoLm1pbihITUZEUildLCBieSA9ICJkbXIiXQptYWxlX2dfZGlncGRbLCBgOj1gKEdxID0gcC5hZGp1c3QoR3AsIG1ldGhvZCA9ICJCSCIpKV0Kc2lnX21hbGVfR19kaWdwZCA8LSBtZXJnZShtX2RtcnNfZGlncGQsIG1hbGVfZ19kaWdwZFtHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIGJ5ID0gImNwZyIpCmBgYApgYGB7cn0KZmVtYWxlX292ZXJsYXBfRyA8LSBtZXJnZShmZW1hbGVzX3BkX0dbR3EgPCAwLjA1XSwgZmVtYWxlX2dfZGlncGRbR3EgPCAwLjA1XSwgYnkgPSBjKCJjcGciLCAiU05QIikpCmZlbWFsZV9vdmVybGFwX0dfbWluX3NucCA8LSBtZXJnZShmZW1hbGVzX3BkX0dbR3EgPCAwLjA1LCAuU0Rbd2hpY2gubWluKEdxKV0sIGJ5ID0gImNwZyJdLCBmZW1hbGVfZ19kaWdwZFtHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIGJ5ID0gYygiY3BnIiwgIlNOUCIpKQpmZW1hbGVfb3ZlcmxhcF9HX2NwZyA8LSBtZXJnZShmZW1hbGVzX3BkX0dbR3EgPCAwLjA1LCAuU0Rbd2hpY2gubWluKEdxKV0sIGJ5ID0gImNwZyJdLCBmZW1hbGVfZ19kaWdwZFtHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIGJ5ID0gYygiY3BnIikpCmZlbWFsZV9vdmVybGFwX0cgIyBTTlAtQ3BHIHBhaXJzIHNpZ25pZmljYW50IGluIGJvdGggY29ob3J0cwpmZW1hbGVfb3ZlcmxhcF9HX21pbl9zbnAgIyBvdmVybGFwIGluIG1pbmltdW0gc2lnbmlmaWNhbnQgU05QIHBlciBDcEcgaW4gY29ob3J0cwpmZW1hbGVfb3ZlcmxhcF9HX2NwZyAjIG92ZXJsYXAgaW4gQ3BHcyB3aXRoIHNpZ25pZmljYW50IFNOUCBiZXR3ZWVuIGNvaG9ydHMKc2lnX2ZlbWFsZV9HX2RpZ3BkICMgUmVwcmVzZW50YXRpdmUgRE1ScyBmb3IgRElHUEQgd2l0aCBhIHNpZ25pZmljYW50IEcgZWZmZWN0CgoKbWFsZV9vdmVybGFwX0cgPC0gbWVyZ2UobWFsZXNfcGRfR1tHcSA8IDAuMDVdLCBtYWxlX2dfZGlncGRbR3EgPCAwLjA1XSwgYnkgPSBjKCJjcGciLCAiU05QIikpCm1hbGVfb3ZlcmxhcF9HX21pbl9zbnAgPC0gbWVyZ2UobWFsZXNfcGRfR1tHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIG1hbGVfZ19kaWdwZFtHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIGJ5ID0gYygiY3BnIiwgIlNOUCIpKQptYWxlX292ZXJsYXBfR19jcGcgPC0gbWVyZ2UobWFsZXNfcGRfR1tHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIG1hbGVfZ19kaWdwZFtHcSA8IDAuMDUsIC5TRFt3aGljaC5taW4oR3EpXSwgYnkgPSAiY3BnIl0sIGJ5ID0gYygiY3BnIikpCm1hbGVfb3ZlcmxhcF9HCm1hbGVfb3ZlcmxhcF9HX21pbl9zbnAKbWFsZV9vdmVybGFwX0dfY3BnCnNpZ19tYWxlX0dfZGlncGQKYGBgCgojIyBQbG90IG91dCBvdmVybGFwCmBgYHtyfQpzaWdfZmVtYWxlX0dfZGlncGRbY3BnICVpbiUgZmVtYWxlX292ZXJsYXBfR19jcGckY3BnXQpsaWJyYXJ5KFZlbm5EaWFncmFtKQp2ZW5uLmRpYWdyYW0oCiAgeCA9IGxpc3QoCiAgICB1bmlxdWUoZmVtYWxlc19wZF9HW0dxIDwgMC4wNV0kY3BnKSwKICAgIHVuaXF1ZShmZW1hbGVfZ19kaWdwZFtHcSA8IDAuMDVdJGNwZyksCiAgICB1bmlxdWUobWFsZXNfcGRfR1tHcSA8IDAuMDVdJGNwZyksCiAgICB1bmlxdWUobWFsZV9nX2RpZ3BkW0dxIDwgMC4wNV0kY3BnKQogICksCiAgY2F0ZWdvcnkubmFtZXMgPSBjKCJURVJSRSBGZW1hbGVzIiwgIkRJR1BEIEZlbWFsZXMiLCAiVEVSUkUgbWFsZXMiLCAiRElHUEQgbWFsZXMiKSwKICBmaWxlbmFtZSA9ICJ0ZXJyZV9kaWdwZF9jcGdfb3ZlcmxhcF9HLnBuZyIsCiAgb3V0cHV0ID0gVFJVRSwKICBpbWFnZXR5cGUgPSAicG5nIiwKICBoZWlnaHQgPSA0ODAsCiAgd2lkdGggPSA0ODAsCiAgcmVzb2x1dGlvbiA9IDMwMCwKICBjb21wcmVzc2lvbiA9ICJsenciLAogIGx3ZCA9IDEsCiAgY29sID0gYygiI2VlYTJhZGZmIiwgIiM4YjVmNjVmZiIsICIjYmNkMmVlZmYiLCAiIzZlN2I4YmZmIiksCiAgZmlsbCA9IGMoYWxwaGEoIiNlZWEyYWRmZiIsIDAuMyksIGFscGhhKCIjOGI1ZjY1ZmYiLCAwLjMpLCBhbHBoYSgiI2JjZDJlZWZmIiwgMC4zKSwgYWxwaGEoIiM2ZTdiOGJmZiIsIDAuMykpLAogIGNleCA9IDAuNSwKICBmb250ZmFtaWx5ID0gInNhbnMiLAogIGNhdC5jZXggPSAwLjMsCiAgY2F0LmRlZmF1bHQucG9zID0gIm91dGVyIiwKICBjYXQucG9zID0gYygtMjcsIDI3LCAtMjcsIDI3KSwKICBjYXQuZGlzdCA9IGMoMC4wNTUsIDAuMDU1LCAwLjA1NSwgMC4wNTUpLAogIGNhdC5mb250ZmFtaWx5ID0gInNhbnMiCiAgIyAgICAgICAgIGNhdC5jb2wgPSBjKCIjNDQwMTU0ZmYiLCAnIzIxOTA4ZGZmJyksCiAgIyAgICAgICAgIHJvdGF0aW9uID0gMQopCgoKdmVubi5kaWFncmFtKAogIHggPSBsaXN0KAogICAgdW5pcXVlKGZlbWFsZXNfcGRfR1ssIC5TRFthbGwoR3EgPiAwLjA1KV0sIGJ5ID0gImNwZyJdJGNwZyksCiAgICB1bmlxdWUoZmVtYWxlX2dfZGlncGRbLCAuU0RbYWxsKEdxID4gMC4wNSldLCBieSA9ICJjcGciXSRjcGcpLAogICAgdW5pcXVlKG1hbGVzX3BkX0dbLCAuU0RbYWxsKEdxID4gMC4wNSldLCBieSA9ICJjcGciXSRjcGcpLAogICAgdW5pcXVlKG1hbGVfZ19kaWdwZFssIC5TRFthbGwoR3EgPiAwLjA1KV0sIGJ5ID0gImNwZyJdJGNwZykKICApLAogIGNhdGVnb3J5Lm5hbWVzID0gYygiVEVSUkUgRmVtYWxlcyIsICJESUdQRCBGZW1hbGVzIiwgIlRFUlJFIG1hbGVzIiwgIkRJR1BEIG1hbGVzIiksCiAgZmlsZW5hbWUgPSAidGVycmVfZGlncGRfY3BnX292ZXJsYXBfbm9fRy5wbmciLAogIG91dHB1dCA9IFRSVUUsCiAgaW1hZ2V0eXBlID0gInBuZyIsCiAgaGVpZ2h0ID0gNDgwLAogIHdpZHRoID0gNDgwLAogIHJlc29sdXRpb24gPSAzMDAsCiAgY29tcHJlc3Npb24gPSAibHp3IiwKICBsd2QgPSAxLAogIGNvbCA9IGMoIiNlZWEyYWRmZiIsICIjOGI1ZjY1ZmYiLCAiI2JjZDJlZWZmIiwgIiM2ZTdiOGJmZiIpLAogIGZpbGwgPSBjKGFscGhhKCIjZWVhMmFkZmYiLCAwLjMpLCBhbHBoYSgiIzhiNWY2NWZmIiwgMC4zKSwgYWxwaGEoIiNiY2QyZWVmZiIsIDAuMyksIGFscGhhKCIjNmU3YjhiZmYiLCAwLjMpKSwKICBjZXggPSAwLjUsCiAgZm9udGZhbWlseSA9ICJzYW5zIiwKICBjYXQuY2V4ID0gMC4zLAogIGNhdC5kZWZhdWx0LnBvcyA9ICJvdXRlciIsCiAgY2F0LnBvcyA9IGMoLTI3LCAyNywgLTI3LCAyNyksCiAgY2F0LmRpc3QgPSBjKDAuMDU1LCAwLjA1NSwgMC4wNTUsIDAuMDU1KSwKICBjYXQuZm9udGZhbWlseSA9ICJzYW5zIgogICMgICAgICAgICBjYXQuY29sID0gYygiIzQ0MDE1NGZmIiwgJyMyMTkwOGRmZicpLAogICMgICAgICAgICByb3RhdGlvbiA9IDEKKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGZhc3RTYXZlKQpjdXJfZW52IDwtIFN5cy5nZXRlbnYoIlBBVEgiKQpTeXMuc2V0ZW52KFBBVEggPSBwYXN0ZShjdXJfZW52LCAiL2hvbWUxL05FVVJPL2Nhc2F6emEvbWluaWNvbmRhMy9iaW4iLCBzZXAgPSAiOiIpKQojIHNhdmUuaW1hZ2UubGJ6aXAyKG4uY29yZXM9MTYpCmxvYWQubGJ6aXAyKCIuUkRhdGFGUyIsbi5jb3Jlcz0zMikKYGBgCgojIyMgbVFUTCByZXBsaWNhdGlvbgpgYGB7cn0Kc2lnX3RlcnJlX20gPC0gZnJlYWQoIi9ob21lMS9ORVVSTy9jYXNhenphL3Byc19ld2FzX2ludGVncmF0aW9uL2Npc19tUVRMX2FuYWx5c2VzL3RlcnJlX2RhdGEvbWFsZV9jaXNfbXF0bF9QRF9DVFBfc2lnLnR4dC5neiIpCnNpZ190ZXJyZV9mIDwtIGZyZWFkKCIvaG9tZTEvTkVVUk8vY2FzYXp6YS9wcnNfZXdhc19pbnRlZ3JhdGlvbi9jaXNfbVFUTF9hbmFseXNlcy90ZXJyZV9kYXRhL2ZlbWFsZV9jaXNfbXF0bF9QRF9DVFBfc2lnLnR4dC5neiIpCnNpZ190ZXJyZSA8LSBmcmVhZCgiL2hvbWUxL05FVVJPL2Nhc2F6emEvcHJzX2V3YXNfaW50ZWdyYXRpb24vY2lzX21RVExfYW5hbHlzZXMvdGVycmVfZGF0YS9jaXNfbXF0bF9QRF9DVFBfc2lnLnR4dC5neiIpCiMgZGlncGRfYWxsIDwtIGZyZWFkKCIvaG9tZTEvTkVVUk8vY2FzYXp6YS9wcnNfZXdhc19pbnRlZ3JhdGlvbi9jaXNfbVFUTF9hbmFseXNlcy9kaWdwZF9kYXRhL2Npc19hbGxfaW1wdXRlX21RVExfcmVzdWx0c19DVFAudHh0IikKZGlncGRfbSA8LSBmcmVhZCgiL2hvbWUxL05FVVJPL2Nhc2F6emEvcHJzX2V3YXNfaW50ZWdyYXRpb24vY2lzX21RVExfYW5hbHlzZXMvZGlncGRfZGF0YS9tYWxlX2Npc19hbGxfaW1wdXRlX21RVExfcmVzdWx0c19QRF9DVFBfbm9fbXV0LnR4dC5neiIpCmRpZ3BkX2YgPC0gZnJlYWQoIi9ob21lMS9ORVVSTy9jYXNhenphL3Byc19ld2FzX2ludGVncmF0aW9uL2Npc19tUVRMX2FuYWx5c2VzL2RpZ3BkX2RhdGEvZmVtYWxlX2Npc19hbGxfaW1wdXRlX21RVExfcmVzdWx0c19QRF9DVFBfbm9fbXV0LnR4dC5neiIpCgojIG1lcmdlZCA8LSBtZXJnZShzaWdfdGVycmUsIGRpZ3BkX2FsbCwgYnkgPSBjKCJTTlAiLCAiZ2VuZSIpKQptZXJnZWRfZiA8LSBtZXJnZShzaWdfdGVycmVfZiwgZGlncGRfZiwgYnkgPSBjKCJTTlAiLCAiZ2VuZSIpKQptZXJnZWRfbSA8LSBtZXJnZShzaWdfdGVycmVfbSwgZGlncGRfbSwgYnkgPSBjKCJTTlAiLCAiZ2VuZSIpKQpgYGAKCmBgYHtyfQojIGxlbmd0aChtZXJnZWQkYEZEUi55YCkKIyBzdW0obWVyZ2VkJGBGRFIueWAgPCAwLjA1KQojIAojIHN1bShtZXJnZWQkYEZEUi55YCA8IDAuMDUpIC8gbGVuZ3RoKG1lcmdlZCRgRkRSLnlgKQojIAojIG5yb3cobWVyZ2VkW0ZEUi55IDwgMC4wNSwgLlNEW3doaWNoLm1pbihgcC12YWx1ZS55YCldLCBieSA9ICJnZW5lIl0pCiMgbGVuZ3RoKHVuaXF1ZShtZXJnZWQkZ2VuZSkpCiMgbnJvdyhtZXJnZWRbRkRSLnkgPCAwLjA1LCAuU0Rbd2hpY2gubWluKGBwLXZhbHVlLnlgKV0sIGJ5ID0gImdlbmUiXSkgLyBsZW5ndGgodW5pcXVlKG1lcmdlZCRnZW5lKSkKCgoKbGVuZ3RoKG1lcmdlZF9mJGBGRFIueWApCnN1bShtZXJnZWRfZiRgRkRSLnlgIDwgMC4wNSkKCnN1bShtZXJnZWRfZiRgRkRSLnlgIDwgMC4wNSkgLyBsZW5ndGgobWVyZ2VkX2YkYEZEUi55YCkKCm5yb3cobWVyZ2VkX2ZbRkRSLnkgPCAwLjA1LCAuU0Rbd2hpY2gubWluKGBwLXZhbHVlLnlgKV0sIGJ5ID0gImdlbmUiXSkKbGVuZ3RoKHVuaXF1ZShtZXJnZWRfZiRnZW5lKSkKbnJvdyhtZXJnZWRfZltGRFIueSA8IDAuMDUsIC5TRFt3aGljaC5taW4oYHAtdmFsdWUueWApXSwgYnkgPSAiZ2VuZSJdKSAvIGxlbmd0aCh1bmlxdWUobWVyZ2VkX2YkZ2VuZSkpCgoKCmxlbmd0aChtZXJnZWRfbSRgRkRSLnlgKQpzdW0obWVyZ2VkX20kYEZEUi55YCA8IDAuMDUpCgpzdW0obWVyZ2VkX20kYEZEUi55YCA8IDAuMDUpIC8gbGVuZ3RoKG1lcmdlZF9tJGBGRFIueWApCgpucm93KG1lcmdlZF9tW0ZEUi55IDwgMC4wNSwgLlNEW3doaWNoLm1pbihgcC12YWx1ZS55YCldLCBieSA9ICJnZW5lIl0pCmxlbmd0aCh1bmlxdWUobWVyZ2VkX20kZ2VuZSkpCmBgYApgYGB7cn0Kc291cmNlKCJ+L3BpMC50c3QuUiIpCmxpYnJhcnkobXVsdHRlc3QpCjEgLSBwaTAudHN0KG1lcmdlZF9mJGBwLXZhbHVlLnlgKQoxIC0gcGkwLnRzdChtZXJnZWRfbSRgcC12YWx1ZS55YCkKYGBgCgoKIyMjIERNUnMgaW4gZWl0aGVyIGRhdGFzZXQgd2l0aCBhIHNpZ25pZmljYW50IGdlbmV0aWMgZWZmZWN0IGluIGJvdGggZGF0YXNldHMgCmBgYHtyfQoodGVycmVfZl9kbXIgPC0gZnJlYWQoIi9ob21lMS9ORVVSTy9TSEFSRV9ERUNJUEhFUi9ETVJzL1RFUlJFL3NpZy5jcGdzLlRFUlJFLkYuSFQuYW5jZXN0cnkuY3N2IikpCm5yb3codGVycmVfZl9kbXJbdGhyZXNob2xkPT0gVFJVRV0pCih0ZXJyZV9tX2RtciA8LSBmcmVhZCgiL2hvbWUxL05FVVJPL1NIQVJFX0RFQ0lQSEVSL0RNUnMvVEVSUkUvc2lnLmNwZ3MuVEVSUkUuTS5IVC5hbmNlc3RyeS5jc3YiKSkKbnJvdyh0ZXJyZV9tX2Rtclt0aHJlc2hvbGQ9PSBUUlVFXSkKCihkaWdwZF9mX2RtciA8LSBmcmVhZCgiL2hvbWUxL05FVVJPL1NIQVJFX0RFQ0lQSEVSL0RNUnMvRElHUEQvc2lnLmNwZ3MuRElHUEQuRi5ub0dCQS5jc3YiKSkKbnJvdyhkaWdwZF9mX2Rtclt0aHJlc2hvbGQ9PSBUUlVFXSkKKGRpZ3BkX21fZG1yIDwtIGZyZWFkKCIvaG9tZTEvTkVVUk8vU0hBUkVfREVDSVBIRVIvRE1Scy9ESUdQRC9zaWcuY3Bncy5ESUdQRC5NLm5vbXV0LmNzdiIpKQpucm93KGRpZ3BkX21fZG1yW3RocmVzaG9sZD09IFRSVUVdKQpgYGAKYGBge3J9CmdldF9zaWdfZG1yIDwtIGZ1bmN0aW9uKGRtcl90YWJsZSwgbXF0bF9kdCl7CiAgbVFUTHMgPC0gbXF0bF9kdFtkbXJfdGFibGUkY3BnLG9uPSJnZW5lIixub21hdGNoPTBdCiAgcmVzPC0gbVFUTHNbRkRSIDwgMC4wNSwuU0Rbd2hpY2gubWluKGBwLXZhbHVlYCldLGJ5PSJnZW5lIl0KICBkbXJzIDwtIHVuaXF1ZShkbXJfdGFibGVbcmVzJGdlbmUsb249ImNwZyJdJGRtcikKICBnZW5lcyA8LSB1bmlxdWUoZG1yX3RhYmxlW3JlcyRnZW5lLG9uPSJjcGciXSRnZW5lcykKICByZXMgPC0gbGlzdChyZXM9cmVzLGRtcj1kbXJzLGdlbmVzPWdlbmVzKQogIHJldHVybihyZXMpCn0KcmVzMSA8LSBnZXRfc2lnX2Rtcih0ZXJyZV9mX2RtcltzaWdfdGVycmVfZltGRFIgPCAwLjA1XSRnZW5lLCBvbj0iY3BnIixub21hdGNoPTBdLGRpZ3BkX2YpCnJlczIgPC0gZ2V0X3NpZ19kbXIodGVycmVfbV9kbXJbc2lnX3RlcnJlX21bRkRSIDwgMC4wNV0kZ2VuZSwgb249ImNwZyIsbm9tYXRjaD0wXSxkaWdwZF9tKQoKcmVzMyA8LSBnZXRfc2lnX2RtcihkaWdwZF9mX2RtcltkaWdwZF9mW0ZEUiA8IDAuMDVdJGdlbmUsIG9uPSJjcGciLG5vbWF0Y2g9MF0sc2lnX3RlcnJlX2YpCnJlczQgPC0gZ2V0X3NpZ19kbXIoZGlncGRfbV9kbXJbZGlncGRfbVtGRFIgPCAwLjA1XSRnZW5lLCBvbj0iY3BnIixub21hdGNoPTBdLHNpZ190ZXJyZV9tKQoKcHJpbnQobGVuZ3RoKHVuaXF1ZShyZXMxJGRtcikpKQpwcmludChsZW5ndGgodW5pcXVlKHJlczIkZG1yKSkpCnByaW50KGxlbmd0aCh1bmlxdWUocmVzMyRkbXIpKSkKcHJpbnQobGVuZ3RoKHVuaXF1ZShyZXM0JGRtcikpKQoKcHJpbnQobGVuZ3RoKHVuaXF1ZShyZXMxJHJlcyRnZW5lKSkpCnByaW50KGxlbmd0aCh1bmlxdWUocmVzMiRyZXMkZ2VuZSkpKQpwcmludChsZW5ndGgodW5pcXVlKHJlczMkcmVzJGdlbmUpKSkKcHJpbnQobGVuZ3RoKHVuaXF1ZShyZXM0JHJlcyRnZW5lKSkpCgpwcmludCh1bmlxdWUocmVzMSRnZW5lcykpCnByaW50KHVuaXF1ZShyZXMyJGdlbmVzKSkKcHJpbnQodW5pcXVlKHJlczMkZ2VuZXMpKQpwcmludCh1bmlxdWUocmVzNCRnZW5lcykpCmBgYApgYGB7cn0KCnJlczEgPC0gZ2V0X3NpZ19kbXIodGVycmVfZl9kbXJbc2lnX3RlcnJlX2ZbRkRSIDwgMC4wNV0kZ2VuZSwgb249ImNwZyIsbm9tYXRjaD0wXVt0aHJlc2hvbGQgPT0gVFJVRV0sZGlncGRfZikKcmVzMiA8LSBnZXRfc2lnX2Rtcih0ZXJyZV9tX2RtcltzaWdfdGVycmVfbVtGRFIgPCAwLjA1XSRnZW5lLCBvbj0iY3BnIixub21hdGNoPTBdW3RocmVzaG9sZCA9PSBUUlVFXSxkaWdwZF9tKQoKcmVzMyA8LSBnZXRfc2lnX2RtcihkaWdwZF9mX2RtcltkaWdwZF9mW0ZEUiA8IDAuMDVdJGdlbmUsIG9uPSJjcGciLG5vbWF0Y2g9MF1bdGhyZXNob2xkID09IFRSVUVdLHNpZ190ZXJyZV9mKQpyZXM0IDwtIGdldF9zaWdfZG1yKGRpZ3BkX21fZG1yW2RpZ3BkX21bRkRSIDwgMC4wNV0kZ2VuZSwgb249ImNwZyIsbm9tYXRjaD0wXVt0aHJlc2hvbGQgPT0gVFJVRV0sc2lnX3RlcnJlX20pCgpwcmludChsZW5ndGgodW5pcXVlKHJlczEkZG1yKSkpCnByaW50KGxlbmd0aCh1bmlxdWUocmVzMiRkbXIpKSkKcHJpbnQobGVuZ3RoKHVuaXF1ZShyZXMzJGRtcikpKQpwcmludChsZW5ndGgodW5pcXVlKHJlczQkZG1yKSkpCnByaW50KGxlbmd0aCh1bmlxdWUocmVzMSRyZXMkZ2VuZSkpKQpwcmludChsZW5ndGgodW5pcXVlKHJlczIkcmVzJGdlbmUpKSkKcHJpbnQobGVuZ3RoKHVuaXF1ZShyZXMzJHJlcyRnZW5lKSkpCnByaW50KGxlbmd0aCh1bmlxdWUocmVzNCRyZXMkZ2VuZSkpKQpwcmludCh1bmlxdWUocmVzMSRnZW5lcykpCnByaW50KHVuaXF1ZShyZXMyJGdlbmVzKSkKcHJpbnQodW5pcXVlKHJlczMkZ2VuZXMpKQpwcmludCh1bmlxdWUocmVzNCRnZW5lcykpCmBgYAoKCiMjIyNQZXJtdXRhdGlvbiB0ZXN0aW5nClNlbGVjdCByYW5kb20gc2V0cyBDcEcgc2l0ZXMgb2Ygc2FtZSBzaXplIGZvciBkYXRhc2V0IGFuZCB0ZXN0IHJlcGxpY2F0aW9uIChpLmUuIGlzIHRoZSByZXBsaWNhdGlvbiBpbiB3aGljaCBzZXRzIG9mIENwRyBzaXRlcyBoYXZlIGFuIG1RVEwgbW9yZSBvciBsZXNzIHRoYW4gZXhwZWN0ZWQgYnkgY2hhbmNlcyk6CgoxLiBUYWtlIGFsbCBDcEcgc2l0ZXMgaW4gYm90aCBkYXRhIHNldHMKMi4gZ2V0IGEgc3Vic2V0IG9mIF9fIENwR3MgaW4gbWFsZXMgYW5kIF9fIENwR3MgaW4gZmVtYWxlcyBmb3IgVEVSUkUsIF9fIENwR3MgaW4gbWFsZXMgYW5kIF9fIENwR3MgaW4gZmVtYWxlcyBmb3IgVEVSUkUgZm9yIERJR1BECjMuIGdldCB3aGljaCBDcEcgaGFzIGFuIG1RVEwgYXQgRkRSIDwgMC4wNQo0LiBjb3VudCBvdmVybGFwIGluIERNUnMgYmV0d2VlbiBkYXRhc2V0cwo1LiAgcmVwZWF0IDEwMDAgVGltZXMgYW5kIHBsb3QgZGlzdHJpYnV0aW9uIG9mIHJlcGxpY2F0aW9uCmBgYHtyfQplcGljX2NwZ3MgPC0gZnJlYWQoIn4vTWV0aHlsYXRpb25FUElDX3YtMS0wX0I0LmNzdiIsIHNraXAgPSA3LCBmaWxsID0gVFJVRSkkTmFtZQptYWxlX24gPC0gdW5pcXVlTihtYWxlX2dwZV9tb2RlbCRjcGcpCmZlbWFsZV9uIDwtIHVuaXF1ZU4oZmVtYWxlX2dwZV9tb2RlbCRjcGcpCmBgYApgYGB7cn0KbV9kbXJzX2RpZ3BkCmBgYAoKCg==